https://sourceware.org/bugzilla/show_bug.cgi?id=26256
--- Comment #15 from Fangrui Song <i at maskray dot me> --- (In reply to H.J. Lu from comment #14) > (In reply to Fangrui Song from comment #13) > > (In reply to H.J. Lu from comment #12) > > > (In reply to Fangrui Song from comment #10) > > > > (In reply to H.J. Lu from comment #8) > > > > > Created attachment 13070 [details] > > > > > A patch with tests > > > > > > > > > > Try this. > > > > > > > > With a minor change, it'll match LLD (I place ordered sections before > > > > unordered sections because Solaris folks said they did so). > > > > > > > > + /* Place ordered sections before unordered sections. */ > > > > + if (bsec != NULL) > > > > + return 1; > > > > + else if (asec != NULL) > > > > + return -1; > > > > + return 0; > > > > > > > > For the test case lld/test/ELF/linkorder-mixed.s , ld-new produced %t, > > > > %t1 > > > > and %t3 now match LLD. > > > > %t2 and %t4 still don't, but they are probably corner cases and don't > > > > matter > > > > in practice. > > > > > > %t2 and %t4 are lld specific behavior. > > > > > > I actually think %t2 and %t4 are generic: ordered .rodata.bar (.byte 3) > > precedes unordered .rodata.bar (.byte 2) > > > > SECTIONS { .rodata : {*(.rodata.foo) *(.rodata.bar)} } > > > > What LLD does is to perform SHF_LINK_ORDER sorting within the input section > > description *(.rodata.bar). I agree that this is a corner case which can > > hardly do harm in practice. > > It is a bug: > > diff --git a/bfd/elflink.c b/bfd/elflink.c > index a1e4635e96..ddff3bfe7b 100644 > --- a/bfd/elflink.c > +++ b/bfd/elflink.c > @@ -11988,9 +11988,7 @@ elf_fixup_link_order (struct bfd_link_info *info, > bfd *abfd, asection *o) > for (p = o->map_head.link_order; p != NULL; p = p->next) > sections[seen_linkorder++] = p; > > - for (indirect_sections = sections, n = 0; > - n < seen_linkorder; > - indirect_sections++, n++) > + for (indirect_sections = sections, n = 0; n < seen_linkorder;) > { > /* Find the first bfd_indirect_link_order section. */ > if (indirect_sections[0]->type == bfd_indirect_link_order) > @@ -12012,6 +12010,11 @@ elf_fixup_link_order (struct bfd_link_info *info, > bfd *abfd, asection *o) > indirect_sections += n_indirect; > n += n_indirect; > } > + else > + { > + indirect_sections++; > + n++; > + } > } Thanks. With this diff added, all the %t* tests are good now. -- You are receiving this mail because: You are on the CC list for the bug.