[PATCH] Remove the stripped group section from linker output

H.J. Lu hjl.tools@gmail.com
Tue Feb 13 04:06:00 GMT 2018


On Mon, Feb 12, 2018 at 6:01 PM, Alan Modra <amodra@gmail.com> wrote:
> On Mon, Feb 12, 2018 at 10:13:40AM -0800, H.J. Lu wrote:
>> GCC 7 and above generates .debug_macro section in COMDAT group with
>> -g3.  But ld fails to recognize that a group section shouldn't be in
>> output when all of its members are stripped.  Update ld to remove the
>> stripped group section from linker output when all members are removed
>> by moving the stripped group section logic from objcopy.c to bfd.c so
>> that "ld -r -S" behaves the same as "strip -g".
>>
>> OK for master?
>
> I think that moving most of objcopy.c:is_strip_section into bfd is a
> bad idea.  You've ended up with an ugly interface with two callback
> functions needed by objcopy, and a function with confusing parameter
> names.
>
>> +bfd_boolean
>> +bfd_stripped_group_section_p
>> +  (bfd *abfd ATTRIBUTE_UNUSED, asection *sec,
>> +   bfd_boolean relocatable_link,
>> +   bfd_boolean (*strip_group_section_p) (bfd *, asection *),
>> +   bfd_boolean (*strip_section_p) (bfd *, asection *))
>> +{
>> +  if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
>> +    {
>> +      asection *elt, *first;
>> +
>> +      /* PR binutils/3181
>> +      If we are going to strip the group signature symbol, then
>> +      strip the group section too.  */
>> +      if (!relocatable_link && strip_group_section_p (abfd, sec))
>> +     return TRUE;
>
> When I first looked at the patch I thought "won't that segfault during
> a final link?", because I'd seen that you pass NULL for the callback
> in bfd_elf_final_link but hadn't realized that relocatable_link was
> always false.  So the name "relocatable_link" is a lie, but I think it
> would be better to leave objcopy.c alone and write a small function in
> elflink.c that simply iterates over the group elements.
>
> static bfd_boolean
> is_discarded_group (asection *sec)
> {
>   asection *elt, *first;
>
>   if ((sec->flags & SEC_GROUP) == 0)
>     return FALSE;
>
>   first = elt = elf_next_in_group (sec);
>   while (elt != NULL)
>     {
>       if (!discarded_section (elt))
>         return FALSE;
>       elt = elf_next_in_group (elt);
>       if (elt == first)
>         break;
>     }
>   return TRUE;
> }
>
> I also think it would be a good idea to set SEC_EXCLUDE for the
> stripped section, just to be consistent with what happens with other
> stripped sections.
>

Like this?


-- 
H.J.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-Remove-the-stripped-group-section-from-linker-output.patch
Type: text/x-patch
Size: 4085 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20180213/708c191d/attachment.bin>


More information about the Binutils mailing list