https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81968

--- Comment #58 from rguenther at suse dot de <rguenther at suse dot de> ---
On Thu, 11 Jan 2018, ro at CeBiTec dot Uni-Bielefeld.DE wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81968
> 
> --- Comment #57 from ro at CeBiTec dot Uni-Bielefeld.DE <ro at CeBiTec dot 
> Uni-Bielefeld.DE> ---
> > --- Comment #56 from rguenther at suse dot de <rguenther at suse dot de> ---
> > On Wed, 10 Jan 2018, ro at CeBiTec dot Uni-Bielefeld.DE wrote:
> [...]
> > I can reproduce that with -ffat-lto-objects where indeed we somehow
> > get confused when we should preserve only part of a SHT_GROUP given
> > we don't "prune" groups.  The question to me is why do we put
> > both macro sections in a single group ...  but that's probably
> > an artifact on how things are supposed to work in the end...
> > [I wonder if SHF_EXCLUDE works "properly" for group members when
> > doing a non-LTO link]
> >
> > Anyway, this should be "easy" to fix with sth like
> >
> >       else if (sh_type == SHT_GROUP)
> >         {
> >           /* Remap section indices in groups and remove removed members.  
> > */
> >           unsigned char *ent, *dst;
> >           for (dst = ent = buf + 4; ent < buf + length - 4; ent += 4)

^^^ typo here, should be ent < buf + length

> >             {
> >               unsigned shndx = type_functions->fetch_Elf_Word (ent);
> >               if (pfnret[shndx - 1] == -1)
> >                 ;
> >               else
> >                 {
> >                   type_functions->set_Elf_Word (dst, sh_map[shndx]);
> >                   dst += 4;
> >                 }
> >             }
> >           /* Adjust the length.  */
> >           length = dst - buf;
> >         }
> >
> > in the group handling.
> >
> > That fixes -ffat-lto-objects handling for me with the testcase.
> > Will re-test with that.
> 
> [I'm continuing this with examples from a build using gas 2.29 instead
> of as since things are easier to see there.]
> 
> While this fixed the error in the group section
> 
> Group Section:  .group
>   Signature Symbol: wm4.0.b58ba986a79b71e96526231091292919
>   Members:
>     index   flags / section
>       [0]   [ COMDAT ]
>       [1]   .debug_macro
> 
> COMDAT group section [    1] `.group' [wm4.0.b58ba986a79b71e96526231091292919]
> contains 1 sections:
>    [Index]    Name
>    [    7]   .debug_macro
> 
> the link error (during ld -r) remains:

From Solaris ld?  In both sources to the testcase I only have one
COMDAT group -- the above indicates there are two?  In elf.h I see
there's a SHT_SUNW_COMDAT - is that used?  That would mean we have to
remap sections not only in SHT_GROUP but also SHT_SUNW_COMDAT?  Also
web docs suggest that SUN ld might discard one of the two sections
because it identifies them by name?  This would mean it breaks whatever
intent we had in producing two .debug_macro (even w/o LTO)?  As said,
on x86_64 linux I have only one comdat .debug_macro section and the
other .debug_macro section refers to that via a reloc entry.

So what's the behavior without -flto here if you do a partial link
of the two input objects?

> ld: fatal: relocation error: R_386_32: file /var/tmp//cco6lLmcdebugobjtem:
> section [6].rel.debug_macro: symbol .debug_macro (section): symbol has been
> discarded with discarded section: [7].debug_macro
> 
> Relocation Section:  .rel.debug_macro
>   index  type      offset value  section      symbol
>     [0]  R_386_32     0x3     0  .debug_macro .debug_line (section)
>     [1]  R_386_32     0x8     0  .debug_macro .debug_macro (section)
>
> We do have two .debug_macro sections and their corresponding reloc
> sections here, as already in the input objects:
> 
> Section Header[6]:  sh_name: .rel.debug_macro
>     sh_addr:      0               sh_flags:   [ SHF_INFO_LINK ]
>     sh_size:      0x10            sh_type:    [ SHT_REL ]
>     sh_offset:    0x324           sh_entsize: 0x8 (2 entries)
>     sh_link:      11              sh_info:    5
>     sh_addralign: 0x4       
> 
> Section Header[8]:  sh_name: .rel.debug_macro
>     sh_addr:      0               sh_flags:   [ SHF_INFO_LINK ]
>     sh_size:      0xa50           sh_type:    [ SHT_REL ]
>     sh_offset:    0xaf4           sh_entsize: 0x8 (330 entries)
>     sh_link:      11              sh_info:    7
>     sh_addralign: 0x4       
> 
> Section Header[5]:  sh_name: .debug_macro
>     sh_addr:      0               sh_flags:   0
>     sh_size:      0x11            sh_type:    [ SHT_PROGBITS ]
>     sh_offset:    0x312           sh_entsize: 0
>     sh_link:      0               sh_info:    0
>     sh_addralign: 0x1       
> 
> Section Header[7]:  sh_name: .debug_macro
>     sh_addr:      0               sh_flags:   [ SHF_GROUP ]
>     sh_size:      0x7c0           sh_type:    [ SHT_PROGBITS ]
>     sh_offset:    0x334           sh_entsize: 0
>     sh_link:      0               sh_info:    0
>     sh_addralign: 0x1       

Yes, and we preserve both.  I'm not 100% sure what the ld error is about?

I do wonder why we have two .debug_macro sections in the first place
but I haven't investigated if that's on purpose.  At least we have the
same without -flto.

Reply via email to