From: Ian Lance Taylor Date: Fri, 21 Dec 2007 23:31:19 +0000 (+0000) Subject: From Cary Coutant: Fix handling of versioned symbols, add some tests. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=99f8facac923848a9496cc34235b608e05a7f160;p=binutils-gdb.git From Cary Coutant: Fix handling of versioned symbols, add some tests. --- diff --git a/gold/dynobj.cc b/gold/dynobj.cc index 18ae92c7228..7e610074ca8 100644 --- a/gold/dynobj.cc +++ b/gold/dynobj.cc @@ -1296,6 +1296,7 @@ Versions::add_def(const Symbol* sym, const char* version, // We have now seen a symbol in this version, so it is not // weak. + gold_assert(vb != NULL); vb->clear_weak(); // FIXME: When we support version scripts, we will need to diff --git a/gold/i386.cc b/gold/i386.cc index 0858e6d149c..6c359401929 100644 --- a/gold/i386.cc +++ b/gold/i386.cc @@ -1583,7 +1583,10 @@ Target_i386::Relocate::relocate(const Relocate_info<32, false>* relinfo, case elfcpp::R_386_PLT32: gold_assert(gsym == NULL || gsym->has_plt_offset() - || gsym->final_value_is_known()); + || gsym->final_value_is_known() + || (gsym->is_defined() + && !gsym->is_from_dynobj() + && !gsym->is_preemptible())); Relocate_functions<32, false>::pcrel32(view, object, psymval, address); break; diff --git a/gold/po/gold.pot b/gold/po/gold.pot index 4b786be4a3a..ff4e2c8f2c6 100644 --- a/gold/po/gold.pot +++ b/gold/po/gold.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2007-12-14 09:45-0800\n" +"POT-Creation-Date: 2007-12-21 15:26-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,47 +16,47 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: archive.cc:95 +#: archive.cc:96 #, c-format msgid "%s: no archive symbol table (run ranlib)" msgstr "" -#: archive.cc:145 +#: archive.cc:147 #, c-format msgid "%s: bad archive symbol table names" msgstr "" -#: archive.cc:175 +#: archive.cc:177 #, c-format msgid "%s: malformed archive header at %zu" msgstr "" -#: archive.cc:195 +#: archive.cc:197 #, c-format msgid "%s: malformed archive header size at %zu" msgstr "" -#: archive.cc:206 +#: archive.cc:208 #, c-format msgid "%s: malformed archive header name at %zu" msgstr "" -#: archive.cc:231 +#: archive.cc:233 #, c-format msgid "%s: bad extended name index at %zu" msgstr "" -#: archive.cc:241 +#: archive.cc:243 #, c-format msgid "%s: bad extended name entry at header %zu" msgstr "" -#: archive.cc:334 +#: archive.cc:336 #, c-format msgid "%s: short archive header at %zu" msgstr "" -#: archive.cc:385 archive.cc:399 +#: archive.cc:387 archive.cc:401 #, c-format msgid "%s: member at %zu is not an ELF object" msgstr "" @@ -104,81 +104,81 @@ msgstr "" msgid "missing DT_NULL in dynamic segment" msgstr "" -#: dynobj.cc:322 +#: dynobj.cc:323 #, c-format msgid "invalid dynamic symbol table name index: %u" msgstr "" -#: dynobj.cc:329 +#: dynobj.cc:330 #, c-format msgid "dynamic symbol table name section has wrong type: %u" msgstr "" -#: dynobj.cc:402 object.cc:238 object.cc:574 +#: dynobj.cc:404 object.cc:241 object.cc:579 #, c-format msgid "bad section name offset for section %u: %lu" msgstr "" -#: dynobj.cc:431 +#: dynobj.cc:433 #, c-format msgid "duplicate definition for version %u" msgstr "" -#: dynobj.cc:460 +#: dynobj.cc:462 #, c-format msgid "unexpected verdef version %u" msgstr "" -#: dynobj.cc:476 +#: dynobj.cc:478 #, c-format msgid "verdef vd_cnt field too small: %u" msgstr "" -#: dynobj.cc:483 +#: dynobj.cc:486 #, c-format msgid "verdef vd_aux field out of range: %u" msgstr "" -#: dynobj.cc:493 +#: dynobj.cc:497 #, c-format msgid "verdaux vda_name field out of range: %u" msgstr "" -#: dynobj.cc:502 +#: dynobj.cc:507 #, c-format msgid "verdef vd_next field out of range: %u" msgstr "" -#: dynobj.cc:535 +#: dynobj.cc:541 #, c-format msgid "unexpected verneed version %u" msgstr "" -#: dynobj.cc:544 +#: dynobj.cc:550 #, c-format msgid "verneed vn_aux field out of range: %u" msgstr "" -#: dynobj.cc:557 +#: dynobj.cc:564 #, c-format msgid "vernaux vna_name field out of range: %u" msgstr "" -#: dynobj.cc:568 +#: dynobj.cc:575 #, c-format msgid "verneed vna_next field out of range: %u" msgstr "" -#: dynobj.cc:579 +#: dynobj.cc:586 #, c-format msgid "verneed vn_next field out of range: %u" msgstr "" -#: dynobj.cc:626 +#: dynobj.cc:634 msgid "size of dynamic symbols is not multiple of symbol size" msgstr "" -#: dynobj.cc:1303 +#: dynobj.cc:1312 #, c-format msgid "symbol %s has undefined version %s" msgstr "" @@ -218,42 +218,42 @@ msgstr "" msgid "%s: fstat failed: %s" msgstr "" -#: fileread.cc:231 +#: fileread.cc:229 #, c-format msgid "%s: pread failed: %s" msgstr "" -#: fileread.cc:237 +#: fileread.cc:235 #, c-format msgid "%s: file too short: read only %lld of %lld bytes at %lld" msgstr "" -#: fileread.cc:312 +#: fileread.cc:310 #, c-format msgid "%s: mmap offset %lld size %lld failed: %s" msgstr "" -#: fileread.cc:393 +#: fileread.cc:391 #, c-format msgid "%s: total bytes mapped for read: %llu\n" msgstr "" -#: fileread.cc:395 +#: fileread.cc:393 #, c-format msgid "%s: maximum bytes mapped for read at one time: %llu\n" msgstr "" -#: fileread.cc:465 +#: fileread.cc:463 #, c-format msgid "cannot find -l%s" msgstr "" -#: fileread.cc:492 +#: fileread.cc:490 #, c-format msgid "cannot find %s" msgstr "" -#: fileread.cc:503 +#: fileread.cc:501 #, c-format msgid "cannot open %s: %s" msgstr "" @@ -336,45 +336,50 @@ msgid "pthread_cond_broadcast failed: %s" msgstr "" #. FIXME: This needs to specify the location somehow. -#: i386.cc:160 i386.cc:1480 x86_64.cc:172 x86_64.cc:1370 +#: i386.cc:160 i386.cc:1484 x86_64.cc:172 x86_64.cc:1373 msgid "missing expected TLS relocation" msgstr "" -#: i386.cc:806 x86_64.cc:761 x86_64.cc:975 +#: i386.cc:810 x86_64.cc:764 x86_64.cc:978 #, c-format msgid "%s: unsupported reloc %u against local symbol" msgstr "" -#: i386.cc:913 i386.cc:1209 x86_64.cc:886 x86_64.cc:1157 +#: i386.cc:917 i386.cc:1213 x86_64.cc:889 x86_64.cc:1160 #, c-format msgid "%s: unexpected reloc %u in object file" msgstr "" -#: i386.cc:1052 x86_64.cc:989 x86_64.cc:1253 +#: i386.cc:1056 x86_64.cc:992 x86_64.cc:1256 #, c-format msgid "%s: unsupported reloc %u against global symbol %s" msgstr "" -#: i386.cc:1363 +#: i386.cc:1367 #, c-format msgid "%s: unsupported RELA reloc section" msgstr "" -#: i386.cc:1620 x86_64.cc:1569 +#: i386.cc:1627 x86_64.cc:1575 #, c-format msgid "unexpected reloc %u in object file" msgstr "" -#: i386.cc:1652 i386.cc:1727 i386.cc:1734 i386.cc:1765 i386.cc:1818 -#: x86_64.cc:1590 x86_64.cc:1670 x86_64.cc:1694 +#: i386.cc:1659 i386.cc:1734 i386.cc:1741 i386.cc:1772 i386.cc:1825 +#: x86_64.cc:1596 x86_64.cc:1676 x86_64.cc:1700 #, c-format msgid "unsupported reloc %u" msgstr "" -#: i386.cc:1742 +#: i386.cc:1749 msgid "both SUN and GNU model TLS relocations" msgstr "" +#: merge.cc:449 +#, c-format +msgid "%s: %s merged constants size: %lu; input: %zu; output: %zu\n" +msgstr "" + #: merge.cc:472 msgid "mergeable string section length not multiple of character size" msgstr "" @@ -383,6 +388,11 @@ msgstr "" msgid "entry in mergeable string section not null terminated" msgstr "" +#: merge.cc:603 +#, c-format +msgid "%s: %s input: %zu\n" +msgstr "" + #: object.cc:53 #, c-format msgid "%s: unsupported ELF machine number %d" @@ -393,122 +403,122 @@ msgstr "" msgid "%s: %s" msgstr "" -#: object.cc:106 +#: object.cc:107 #, c-format msgid "section name section has wrong type: %u" msgstr "" -#: object.cc:311 +#: object.cc:315 #, c-format msgid "invalid symbol table name index: %u" msgstr "" -#: object.cc:317 +#: object.cc:321 #, c-format msgid "symbol table name section has wrong type: %u" msgstr "" -#: object.cc:397 +#: object.cc:402 #, c-format msgid "section group %u info %u out of range" msgstr "" -#: object.cc:415 +#: object.cc:420 #, c-format msgid "symbol %u name offset %u out of range" msgstr "" -#: object.cc:447 +#: object.cc:452 #, c-format msgid "section %u in section group %u out of range" msgstr "" -#: object.cc:537 reloc.cc:205 reloc.cc:520 +#: object.cc:542 reloc.cc:206 reloc.cc:530 #, c-format msgid "relocation section %u has bad info %u" msgstr "" -#: object.cc:709 +#: object.cc:713 msgid "size of symbols is not multiple of symbol size" msgstr "" -#: object.cc:808 +#: object.cc:812 #, c-format msgid "local symbol %u section name out of range: %u >= %u" msgstr "" #. FIXME: Handle SHN_XINDEX. -#: object.cc:865 +#: object.cc:869 #, c-format msgid "unknown section index %u for local symbol %u" msgstr "" -#: object.cc:874 +#: object.cc:878 #, c-format msgid "local symbol %u section index %u out of range" msgstr "" -#: object.cc:1194 +#: object.cc:1181 #, c-format msgid "%s: incompatible target" msgstr "" -#: object.cc:1349 +#: object.cc:1336 #, c-format msgid "%s: unsupported ELF file type %d" msgstr "" -#: object.cc:1368 object.cc:1414 object.cc:1448 +#: object.cc:1355 object.cc:1401 object.cc:1435 #, c-format msgid "%s: ELF file too short" msgstr "" -#: object.cc:1376 +#: object.cc:1363 #, c-format msgid "%s: invalid ELF version 0" msgstr "" -#: object.cc:1378 +#: object.cc:1365 #, c-format msgid "%s: unsupported ELF version %d" msgstr "" -#: object.cc:1385 +#: object.cc:1372 #, c-format msgid "%s: invalid ELF class 0" msgstr "" -#: object.cc:1391 +#: object.cc:1378 #, c-format msgid "%s: unsupported ELF class %d" msgstr "" -#: object.cc:1398 +#: object.cc:1385 #, c-format msgid "%s: invalid ELF data encoding" msgstr "" -#: object.cc:1404 +#: object.cc:1391 #, c-format msgid "%s: unsupported ELF data encoding %d" msgstr "" -#: object.cc:1424 +#: object.cc:1411 #, c-format msgid "%s: not configured to support 32-bit big-endian object" msgstr "" -#: object.cc:1437 +#: object.cc:1424 #, c-format msgid "%s: not configured to support 32-bit little-endian object" msgstr "" -#: object.cc:1458 +#: object.cc:1445 #, c-format msgid "%s: not configured to support 64-bit big-endian object" msgstr "" -#: object.cc:1471 +#: object.cc:1458 #, c-format msgid "%s: not configured to support 64-bit little-endian object" msgstr "" @@ -856,47 +866,47 @@ msgstr "" msgid "--threads not supported" msgstr "" -#: output.cc:1467 +#: output.cc:1478 #, c-format msgid "invalid alignment %lu for section \"%s\"" msgstr "" -#: output.cc:2334 +#: output.cc:2383 #, c-format msgid "%s: open: %s" msgstr "" -#: output.cc:2354 +#: output.cc:2403 #, c-format msgid "%s: mremap: %s" msgstr "" -#: output.cc:2390 +#: output.cc:2439 #, c-format msgid "%s: lseek: %s" msgstr "" -#: output.cc:2393 output.cc:2430 +#: output.cc:2442 output.cc:2479 #, c-format msgid "%s: write: %s" msgstr "" -#: output.cc:2401 +#: output.cc:2450 #, c-format msgid "%s: mmap: %s" msgstr "" -#: output.cc:2411 +#: output.cc:2460 #, c-format msgid "%s: munmap: %s" msgstr "" -#: output.cc:2428 +#: output.cc:2477 #, c-format msgid "%s: write: unexpected 0 return-value" msgstr "" -#: output.cc:2440 +#: output.cc:2489 #, c-format msgid "%s: close: %s" msgstr "" @@ -912,27 +922,27 @@ msgid "%s: ordinary object found in input group" msgstr "" #. Here we have to handle any other input file types we need. -#: readsyms.cc:244 +#: readsyms.cc:242 #, c-format msgid "%s: not an object or archive" msgstr "" -#: reloc.cc:224 reloc.cc:538 +#: reloc.cc:225 reloc.cc:548 #, c-format msgid "relocation section %u uses unexpected symbol table %u" msgstr "" -#: reloc.cc:239 reloc.cc:556 +#: reloc.cc:240 reloc.cc:566 #, c-format msgid "unexpected entsize for reloc section %u: %lu != %u" msgstr "" -#: reloc.cc:248 reloc.cc:565 +#: reloc.cc:249 reloc.cc:575 #, c-format msgid "reloc section %u size %lu uneven" msgstr "" -#: reloc.cc:759 +#: reloc.cc:839 #, c-format msgid "reloc section size %zu is not a multiple of reloc size %d\n" msgstr "" @@ -974,82 +984,82 @@ msgid "" "T" msgstr "" -#: stringpool.cc:535 +#: stringpool.cc:537 #, c-format msgid "%s: %s entries: %zu; buckets: %zu\n" msgstr "" -#: stringpool.cc:539 +#: stringpool.cc:541 #, c-format msgid "%s: %s entries: %zu\n" msgstr "" -#: stringpool.cc:542 +#: stringpool.cc:544 #, c-format msgid "%s: %s Stringdata structures: %zu\n" msgstr "" -#: symtab.cc:595 +#: symtab.cc:603 #, c-format msgid "bad global symbol name offset %u at %zu" msgstr "" -#: symtab.cc:673 +#: symtab.cc:682 msgid "too few symbol versions" msgstr "" -#: symtab.cc:702 +#: symtab.cc:711 #, c-format msgid "bad symbol name offset %u at %zu" msgstr "" -#: symtab.cc:756 +#: symtab.cc:765 #, c-format msgid "versym for symbol %zu out of range: %u" msgstr "" -#: symtab.cc:764 +#: symtab.cc:773 #, c-format msgid "versym for symbol %zu has no name: %u" msgstr "" -#: symtab.cc:1482 symtab.cc:1698 +#: symtab.cc:1493 symtab.cc:1709 #, c-format msgid "%s: unsupported symbol section 0x%x" msgstr "" -#: symtab.cc:1822 +#: symtab.cc:1833 #, c-format msgid "%s: undefined reference to '%s'" msgstr "" -#: symtab.cc:1907 +#: symtab.cc:1918 #, c-format msgid "%s: symbol table entries: %zu; buckets: %zu\n" msgstr "" -#: symtab.cc:1910 +#: symtab.cc:1921 #, c-format msgid "%s: symbol table entries: %zu\n" msgstr "" -#: symtab.cc:1979 +#: symtab.cc:1990 #, c-format msgid "" "while linking %s: symbol '%s' defined in multiple places (possible ODR " "violation):" msgstr "" -#: target-reloc.h:211 +#: target-reloc.h:212 #, c-format msgid "reloc has bad offset %zu" msgstr "" -#: tls.h:58 +#: tls.h:59 msgid "TLS relocation out of range" msgstr "" -#: tls.h:72 +#: tls.h:73 msgid "TLS relocation against invalid instruction" msgstr "" @@ -1073,12 +1083,12 @@ msgstr "" msgid "%s failed: %s" msgstr "" -#: x86_64.cc:1278 +#: x86_64.cc:1281 #, c-format msgid "%s: unsupported REL reloc section" msgstr "" -#: x86_64.cc:1742 +#: x86_64.cc:1748 #, c-format msgid "unsupported reloc type %u" msgstr "" diff --git a/gold/symtab.cc b/gold/symtab.cc index d39d739978c..4a1c5ee9ef7 100644 --- a/gold/symtab.cc +++ b/gold/symtab.cc @@ -480,10 +480,18 @@ Symbol_table::add_from_object(Object* object, // NAME/NULL point to NAME/VERSION. insdef.first->second = ret; } - else if (insdef.first->second != ret) + else if (insdef.first->second != ret + && insdef.first->second->is_undefined()) { // This is the unfortunate case where we already have - // entries for both NAME/VERSION and NAME/NULL. + // entries for both NAME/VERSION and NAME/NULL. Note + // that we don't want to combine them if the existing + // symbol is going to override the new one. FIXME: We + // currently just test is_undefined, but this may not do + // the right thing if the existing symbol is from a + // shared library and the new one is from a regular + // object. + const Sized_symbol* sym2; sym2 = this->get_sized_symbol SELECT_SIZE_NAME(size) ( insdef.first->second diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am index 6156527c5b0..8083ff08d3c 100644 --- a/gold/testsuite/Makefile.am +++ b/gold/testsuite/Makefile.am @@ -482,6 +482,26 @@ flagstest_o_specialfile_and_compress_debug_sections: flagstest_debug.o \ chmod a+x $@ test -s $@ +# Test symbol versioning. +check_PROGRAMS += ver_test +ver_test_SOURCES = ver_test_main.cc +ver_test_DEPENDENCIES = gcctestdir/ld ver_test_1.so ver_test_2.so ver_test_4.so +ver_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,. +ver_test_LDADD = ver_test_1.so ver_test_2.so ver_test_4.so +ver_test_1.so: ver_test_1.o ver_test_2.so ver_test_3.o ver_test_4.so gcctestdir/ld + $(CXXLINK) -Bgcctestdir/ -shared ver_test_1.o ver_test_2.so ver_test_3.o ver_test_4.so +ver_test_2.so: ver_test_2.o $(srcdir)/ver_test_2.script ver_test_4.so + $(CXXLINK) -shared -Wl,--version-script,$(srcdir)/ver_test_2.script ver_test_2.o ver_test_4.so +ver_test_4.so: ver_test_4.o $(srcdir)/ver_test_4.script + $(CXXLINK) -shared -Wl,--version-script,$(srcdir)/ver_test_4.script ver_test_4.o +ver_test_1.o: ver_test_1.cc + $(CXXCOMPILE) -c -fpic -o $@ $< +ver_test_2.o: ver_test_2.cc + $(CXXCOMPILE) -c -fpic -o $@ $< +ver_test_3.o: ver_test_3.cc + $(CXXCOMPILE) -c -fpic -o $@ $< +ver_test_4.o: ver_test_4.cc + $(CXXCOMPILE) -c -fpic -o $@ $< endif GCC endif NATIVE_LINKER diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in index 8af1934c16b..316cf00836c 100644 --- a/gold/testsuite/Makefile.in +++ b/gold/testsuite/Makefile.in @@ -166,9 +166,12 @@ check_PROGRAMS = object_unittest$(EXEEXT) $(am__EXEEXT_1) \ # The specialfile output has a tricky case when we also compress debug # sections, because it requires output-file resizing. + +# Test symbol versioning. @GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_10 = flagstest_compress_debug_sections \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile_and_compress_debug_sections +@GCC_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile_and_compress_debug_sections \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test subdir = testsuite DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 @@ -229,7 +232,8 @@ libgoldtest_a_OBJECTS = $(am_libgoldtest_a_OBJECTS) @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@am__EXEEXT_6 = tls_shared_nonpic_test$(EXEEXT) @GCC_TRUE@@NATIVE_LINKER_TRUE@am__EXEEXT_7 = flagstest_compress_debug_sections$(EXEEXT) \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile$(EXEEXT) \ -@GCC_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile_and_compress_debug_sections$(EXEEXT) +@GCC_TRUE@@NATIVE_LINKER_TRUE@ flagstest_o_specialfile_and_compress_debug_sections$(EXEEXT) \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test$(EXEEXT) basic_pic_test_SOURCES = basic_pic_test.c basic_pic_test_OBJECTS = basic_pic_test.$(OBJEXT) basic_pic_test_LDADD = $(LDADD) @@ -467,6 +471,10 @@ am__two_file_test_SOURCES_DIST = two_file_test_1.cc two_file_test_2.cc \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ two_file_test_main.$(OBJEXT) two_file_test_OBJECTS = $(am_two_file_test_OBJECTS) two_file_test_LDADD = $(LDADD) +am__ver_test_SOURCES_DIST = ver_test_main.cc +@GCC_TRUE@@NATIVE_LINKER_TRUE@am_ver_test_OBJECTS = \ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_main.$(OBJEXT) +ver_test_OBJECTS = $(am_ver_test_OBJECTS) am__weak_test_SOURCES_DIST = weak_test.cc @GCC_TRUE@@NATIVE_LINKER_TRUE@am_weak_test_OBJECTS = \ @GCC_TRUE@@NATIVE_LINKER_TRUE@ weak_test.$(OBJEXT) @@ -513,7 +521,7 @@ SOURCES = $(libgoldtest_a_SOURCES) basic_pic_test.c \ $(two_file_shared_2_pic_1_test_SOURCES) \ $(two_file_shared_2_test_SOURCES) \ $(two_file_static_test_SOURCES) $(two_file_test_SOURCES) \ - $(weak_test_SOURCES) + $(ver_test_SOURCES) $(weak_test_SOURCES) DIST_SOURCES = $(libgoldtest_a_SOURCES) basic_pic_test.c \ basic_static_pic_test.c basic_static_test.c basic_test.c \ $(am__constructor_static_test_SOURCES_DIST) \ @@ -548,7 +556,7 @@ DIST_SOURCES = $(libgoldtest_a_SOURCES) basic_pic_test.c \ $(am__two_file_shared_2_pic_1_test_SOURCES_DIST) \ $(am__two_file_shared_2_test_SOURCES_DIST) \ $(am__two_file_static_test_SOURCES_DIST) \ - $(am__two_file_test_SOURCES_DIST) \ + $(am__two_file_test_SOURCES_DIST) $(am__ver_test_SOURCES_DIST) \ $(am__weak_test_SOURCES_DIST) ETAGS = etags CTAGS = ctags @@ -893,6 +901,10 @@ object_unittest_SOURCES = object_unittest.cc @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@tls_shared_nonpic_test_DEPENDENCIES = gcctestdir/ld tls_test_shared_nonpic.so @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@tls_shared_nonpic_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,. @FN_PTRS_IN_SO_WITHOUT_PIC_TRUE@@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@tls_shared_nonpic_test_LDADD = tls_test_shared_nonpic.so -lpthread +@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_SOURCES = ver_test_main.cc +@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_DEPENDENCIES = gcctestdir/ld ver_test_1.so ver_test_2.so ver_test_4.so +@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,. +@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_LDADD = ver_test_1.so ver_test_2.so ver_test_4.so all: all-am .SUFFIXES: @@ -1074,6 +1086,9 @@ two_file_static_test$(EXEEXT): $(two_file_static_test_OBJECTS) $(two_file_static two_file_test$(EXEEXT): $(two_file_test_OBJECTS) $(two_file_test_DEPENDENCIES) @rm -f two_file_test$(EXEEXT) $(CXXLINK) $(two_file_test_LDFLAGS) $(two_file_test_OBJECTS) $(two_file_test_LDADD) $(LIBS) +ver_test$(EXEEXT): $(ver_test_OBJECTS) $(ver_test_DEPENDENCIES) + @rm -f ver_test$(EXEEXT) + $(CXXLINK) $(ver_test_LDFLAGS) $(ver_test_OBJECTS) $(ver_test_LDADD) $(LIBS) weak_test$(EXEEXT): $(weak_test_OBJECTS) $(weak_test_DEPENDENCIES) @rm -f weak_test$(EXEEXT) $(CXXLINK) $(weak_test_LDFLAGS) $(weak_test_OBJECTS) $(weak_test_LDADD) $(LIBS) @@ -1105,6 +1120,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/two_file_test_1.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/two_file_test_2.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/two_file_test_main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ver_test_main.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/weak_test.Po@am__quote@ .c.o: @@ -1522,6 +1538,20 @@ uninstall-am: uninstall-info-am @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -o /dev/stdout $< --compress-debug-sections=zlib 2>&1 | cat > $@ @GCC_TRUE@@NATIVE_LINKER_TRUE@ chmod a+x $@ @GCC_TRUE@@NATIVE_LINKER_TRUE@ test -s $@ +@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_1.so: ver_test_1.o ver_test_2.so ver_test_3.o ver_test_4.so gcctestdir/ld +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared ver_test_1.o ver_test_2.so ver_test_3.o ver_test_4.so +@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_2.so: ver_test_2.o $(srcdir)/ver_test_2.script ver_test_4.so +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -shared -Wl,--version-script,$(srcdir)/ver_test_2.script ver_test_2.o ver_test_4.so +@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_4.so: ver_test_4.o $(srcdir)/ver_test_4.script +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -shared -Wl,--version-script,$(srcdir)/ver_test_4.script ver_test_4.o +@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_1.o: ver_test_1.cc +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -c -fpic -o $@ $< +@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_2.o: ver_test_2.cc +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -c -fpic -o $@ $< +@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_3.o: ver_test_3.cc +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -c -fpic -o $@ $< +@GCC_TRUE@@NATIVE_LINKER_TRUE@ver_test_4.o: ver_test_4.cc +@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -c -fpic -o $@ $< # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: diff --git a/gold/testsuite/ver_test.h b/gold/testsuite/ver_test.h new file mode 100644 index 00000000000..a75731eb241 --- /dev/null +++ b/gold/testsuite/ver_test.h @@ -0,0 +1,40 @@ +// basic_test.cc -- a test case for gold + +// Copyright 2007 Free Software Foundation, Inc. +// Written by Ian Lance Taylor . + +// This file is part of gold. + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +// MA 02110-1301, USA. + +#ifdef USE_TRACE +#include +#define TRACE printf("In %s, %s()\n", __FILE__, __FUNCTION__); +#else +#define TRACE +#endif + +extern bool t1(); +extern bool t2(); +extern bool t3(); + +extern "C" { + +extern int t1_2(); +extern int t2_2(); +extern int t3_2(); + +} diff --git a/gold/testsuite/ver_test_1.cc b/gold/testsuite/ver_test_1.cc new file mode 100644 index 00000000000..23421c434fa --- /dev/null +++ b/gold/testsuite/ver_test_1.cc @@ -0,0 +1,33 @@ +// basic_test.cc -- a test case for gold + +// Copyright 2007 Free Software Foundation, Inc. +// Written by Ian Lance Taylor . + +// This file is part of gold. + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +// MA 02110-1301, USA. + +#include "ver_test.h" + +// Calls an unversioned function in file1 that overrides +// a versioned function in file2. + +bool +t1() +{ + TRACE + return t1_2() == 11; +} diff --git a/gold/testsuite/ver_test_2.cc b/gold/testsuite/ver_test_2.cc new file mode 100644 index 00000000000..39fa04ed588 --- /dev/null +++ b/gold/testsuite/ver_test_2.cc @@ -0,0 +1,40 @@ +// basic_test.cc -- a test case for gold + +// Copyright 2007 Free Software Foundation, Inc. +// Written by Ian Lance Taylor . + +// This file is part of gold. + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +// MA 02110-1301, USA. + +#include "ver_test.h" + +#if 0 +__asm__(".symver t1_2_a,t1_2@VER2"); + +extern "C" +int +t1_2_a(); + +#define t1_2 t1_2_a +#endif + +int +t3_2() +{ + TRACE + return t1_2(); +} diff --git a/gold/testsuite/ver_test_2.script b/gold/testsuite/ver_test_2.script new file mode 100644 index 00000000000..3756d6d0c34 --- /dev/null +++ b/gold/testsuite/ver_test_2.script @@ -0,0 +1,31 @@ +## basic_test.cc -- a test case for gold + +## Copyright 2007 Free Software Foundation, Inc. +## Written by Ian Lance Taylor . + +## This file is part of gold. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or +## (at your option) any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +## MA 02110-1301, USA. + +VER1 { +}; + +VER2 { + global: + t1_2; + t3_2; +} VER1; + diff --git a/gold/testsuite/ver_test_3.cc b/gold/testsuite/ver_test_3.cc new file mode 100644 index 00000000000..ad1d5588bab --- /dev/null +++ b/gold/testsuite/ver_test_3.cc @@ -0,0 +1,33 @@ +// basic_test.cc -- a test case for gold + +// Copyright 2007 Free Software Foundation, Inc. +// Written by Ian Lance Taylor . + +// This file is part of gold. + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +// MA 02110-1301, USA. + +#include "ver_test.h" + +int +t1_2() __attribute((visibility("hidden"))); + +int +t1_2() +{ + TRACE + return 11; +} diff --git a/gold/testsuite/ver_test_4.cc b/gold/testsuite/ver_test_4.cc new file mode 100644 index 00000000000..372b91f58c1 --- /dev/null +++ b/gold/testsuite/ver_test_4.cc @@ -0,0 +1,53 @@ +// basic_test.cc -- a test case for gold + +// Copyright 2007 Free Software Foundation, Inc. +// Written by Ian Lance Taylor . + +// This file is part of gold. + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +// MA 02110-1301, USA. + +#include "ver_test.h" + +__asm__(".symver t1_2_a,t1_2@@VER2"); + +extern "C" +int +t1_2_a() +{ + TRACE + return 12; +} + +__asm__(".symver t2_2_a,t2_2@VER1"); + +extern "C" +int +t2_2_a() +{ + TRACE + return 21; +} + +__asm__(".symver t2_2_b,t2_2@@VER2"); + +extern "C" +int +t2_2_b() +{ + TRACE + return 22; +} diff --git a/gold/testsuite/ver_test_4.script b/gold/testsuite/ver_test_4.script new file mode 100644 index 00000000000..97cf72fbc0e --- /dev/null +++ b/gold/testsuite/ver_test_4.script @@ -0,0 +1,35 @@ +## basic_test.cc -- a test case for gold + +## Copyright 2007 Free Software Foundation, Inc. +## Written by Ian Lance Taylor . + +## This file is part of gold. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or +## (at your option) any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +## MA 02110-1301, USA. + +VER1 { + global: + t2_2; + local: + *; +}; + +VER2 { + global: + t1_2; + t2_2; +} VER1; + diff --git a/gold/testsuite/ver_test_main.cc b/gold/testsuite/ver_test_main.cc new file mode 100644 index 00000000000..9eb6ccdc9d6 --- /dev/null +++ b/gold/testsuite/ver_test_main.cc @@ -0,0 +1,54 @@ +// basic_test.cc -- a test case for gold + +// Copyright 2007 Free Software Foundation, Inc. +// Written by Ian Lance Taylor . + +// This file is part of gold. + +// This program is free software; you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation; either version 3 of the License, or +// (at your option) any later version. + +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with this program; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, +// MA 02110-1301, USA. + +#include + +#include "ver_test.h" + +int +main() +{ + assert(t1()); + assert(t2()); + assert(t3()); + return 0; +} + +// Calls a function in file2 that has two versions and verifies +// that the default version is called. + +bool +t2() +{ + TRACE + return t2_2() == 22; +} + +// Call a function in a shared library that calls explicitly +// the version of t1_2() defined in another shared library. + +bool +t3() +{ + TRACE + return t3_2() == 12; +} diff --git a/gold/x86_64.cc b/gold/x86_64.cc index ddd125d6ee5..afa8070f7b4 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -1483,7 +1483,10 @@ Target_x86_64::Relocate::relocate(const Relocate_info<64, false>* relinfo, case elfcpp::R_X86_64_PLT32: gold_assert(gsym == NULL || gsym->has_plt_offset() - || gsym->final_value_is_known()); + || gsym->final_value_is_known() + || (gsym->is_defined() + && !gsym->is_from_dynobj() + && !gsym->is_preemptible())); // Note: while this code looks the same as for R_X86_64_PC32, it // behaves differently because psymval was set to point to // the PLT entry, rather than the symbol, in Scan::global().