http://sourceware.org/bugzilla/show_bug.cgi?id=12181
Summary: local COMDAT group names break linking libstdc++.so with Sun ld Product: binutils Version: 2.21 (HEAD) Status: NEW Severity: normal Priority: P2 Component: gas AssignedTo: unassig...@sources.redhat.com ReportedBy: r...@techfak.uni-bielefeld.de CC: m...@codesourcery.com Host: i386-pc-solaris2.11 Target: i386-pc-solaris2.11 Build: i386-pc-solaris2.11 Created attachment 5105 --> http://sourceware.org/bugzilla/attachment.cgi?id=5105 testcase When trying to bootstrap GCC mainline with gas from CVS binutils, linking libstdc++.so failed when using Sun ld on Solaris 11 (build 147). The attached testcase shows the problem (derived from bitmap_allocator.s): $ gas -o group.o group.s $ ld -G -o group.so group.o ld: fatal: file group.o: group section [1].group: invalid group symbol D5Ev ld: fatal: file group.o: section [1].group: SHF_GROUP flag set, but no corresponding SHT_GROUP section found ld: fatal: file group.o: section [5].text.D2Ev: SHF_GROUP flag set, but no corresponding SHT_GROUP section found ld: fatal: file group.o: section [6].text.D0Ev: SHF_GROUP flag set, but no corresponding SHT_GROUP section found ld: fatal: file processing errors. No output written to group.so ld chokes because the group symbol is local: $ nm group.o group.o: [Index] Value Size Type Bind Other Shndx Name [1] | 0| 0|SECT |LOCL |0 |2 | [2] | 0| 0|SECT |LOCL |0 |3 | [3] | 0| 0|SECT |LOCL |0 |4 | [4] | 0| 0|SECT |LOCL |0 |5 | [9] | 0| 0|SECT |LOCL |0 |1 | [6] | 0| 0|SECT |LOCL |0 |6 | [7] | 0| 0|FUNC |LOCL |0 |6 |D0Ev [5] | 0| 0|FUNC |LOCL |0 |5 |D2Ev [8] | 0| 0|NOTY |LOCL |0 |1 |D5Ev The source of the linker error can be seen in the OpenSolaris sources: http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/cmd/sgs/libld/common/groups.c#205 Using elfedit to change D5Ev to global allows the link to succeed. This breakage was introduced by this patch: 2010-10-23 Mark Mitchell <m...@codesourcery.com> * config/obj-elf.c (elf_adjust_symtab): New. Move group section processing here from elf_frob_file. Ensure that group signature symbols have the name of the group. (elf_frob_file): Move group section processing to elf_adjust_symtab. * config/obj-elf.h (elf_adjust_symtab): Declare. (obj_adjust_symtab): Define. * config/tc-arm.c (arm_adjust_symtab): Call elf_adjust_symtab. If I do the binding change in gas/config/obj-elf.c (elf_adjust_symtab) like this diff --git a/gas/config/obj-elf.c b/gas/config/obj-elf.c index 79f8033..07688ea 100644 --- a/gas/config/obj-elf.c +++ b/gas/config/obj-elf.c @@ -2142,7 +2142,7 @@ elf_adjust_symtab (void) { /* Create the symbol now. */ sy = symbol_new (group_name, now_seg, (valueT) 0, frag_now); - symbol_get_obj (sy)->local = 1; + symbol_get_bfdsym (sy)->flags |= BSF_OBJECT | BSF_GLOBAL; symbol_table_insert (sy); } elf_group_id (s) = symbol_get_bfdsym (sy); I can sucessfully link libstdc++.so, but linking programs against libgcj.so later fails. A GCC bootstrap with CVS gas and gld works, but regresses in the libstdc++ testsuite: FAIL: libstdc++-abi/abi_check because the same artificial section names I tripped over when developing COMDAT group support with Sun as http://gcc.gnu.org/ml/gcc-patches/2010-05/msg01365.html http://gcc.gnu.org/ml/gcc-patches/2010-06/msg00600.html now become global and produce abi_check errors because they cannot be demangled: 48 added symbols 0 _ZNSs12_Alloc_hiderC5EPcRKSaIcE error code = -2: invalid mangled name version status: incompatible GLIBCXX_3.4 type: function status: added I'm somewhat at a loss how to deal with this. It would be really good to have this fixed before 2.21 is released, otherwise gas 2.21 would be unusable with gcc 4.6.0 and Sun ld. -- Configure bugmail: http://sourceware.org/bugzilla/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are on the CC list for the bug. _______________________________________________ bug-binutils mailing list bug-binutils@gnu.org http://lists.gnu.org/mailman/listinfo/bug-binutils