This is the mail archive of the
mailing list for the binutils project.
Re: [Patch, mach-o/gas] correct a case where stub size is not filled in by GAS.
On 9 Feb 2012, at 15:17, Tristan Gingold wrote:
On Feb 9, 2012, at 3:28 PM, Iain Sandoe wrote:
the stub size for well-known-stub sections is not filled in from
the BFD section translation table, but the other flags *are* when
the section type is recognized.
This leads to a failure to fill in the stub-size when someone
specifies a well-known stub section by a hand-written section
command. (e.g. darwin.S in libffi).
Sorry, but I still do not understand the patch. Maybe you should
quote the line in darwin.S if this is not this one:
that's the line.
Currently, stub_size is always extracted from the .section (but
default to 0). So currently it was set to 5. What your patch
changes on darwin.S ?
the size is extracted correctly and passed to
However, when obj_mach_o_make_or_get_sect makes the section - it will
be provided with default values for the attributes and flags by BFD
[ which recognizes the section as a 'standard' one]. However, this
does not include the stub-size, which is not part of our translation
table at present.
Anyway, in obj_mach_o_make_or_get_sect () we then find that flags !=
NO_FLAGS and so bypass the code that filled in the stub size.
Also, I don't understand why stub_size is handled differently from
Well, it seemed to expand the translation tables a lot for just a
handful of cases .. it seemed like bloat... I guess we could revisit
* config/obj-macho.c (obj_mach_o_make_or_get_sect): Always fill in
when provided. (obj_mach_o_section): Flag that stub-size has been
diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c
index ba09780..17a21e6 100644
@@ -168,6 +168,7 @@ obj_mach_o_get_section_names (char *seg, char
#define SECT_TYPE_SPECIFIED 0x0001
#define SECT_ATTR_SPECIFIED 0x0002
#define SECT_ALGN_SPECIFIED 0x0004
+#define SECT_STUB_SPECIFIED 0x0008
obj_mach_o_make_or_get_sect (char * segname, char * sectname,
@@ -267,7 +268,6 @@ obj_mach_o_make_or_get_sect (char * segname,
char * sectname,
msect->align = secalign;
msect->flags = sectype | secattr;
- msect->reserved2 = stub_size;
if (sectype == BFD_MACH_O_S_ZEROFILL
|| sectype == BFD_MACH_O_S_GB_ZEROFILL)
@@ -280,6 +280,10 @@ obj_mach_o_make_or_get_sect (char * segname,
char * sectname,
as_warn (_("Ignoring changed section attributes for %s"), name);
+ if (specified_mask & SECT_STUB_SPECIFIED)
+ /* At present, the stub size is not supplied from the BFD
+ msect->reserved2 = stub_size;
@@ -413,6 +417,7 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
sizeof_stub = get_absolute_expression ();
+ specified_mask |= SECT_STUB_SPECIFIED;
else if ((specified_mask & SECT_ATTR_SPECIFIED)
&& sectype == BFD_MACH_O_S_SYMBOL_STUBS)