From 9c2d0ef98abc05ea6fae35be6db732b22bba71b5 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Tue, 16 Sep 2008 17:23:37 +0000 Subject: [PATCH] * target-reloc.h (relocate_section): Check whether a symbol is defined by the ABI before reporting an undefined symbol error. * target.h (Target::is_defined_by_abi): Make parameter const. (Target::do_is_defined_by_abi): Likewise. * i386.cc (Target_i386::do_is_defined_by_abi): Likewise. * powerpc.cc (Target_powerpc::do_is_defined_by_abi): Likewise. * sparc.cc (Target_sparc::do_is_defined_by_abi): Likewise. * x86_64.cc (Target_x86_64::do_is_defined_by_abi): Likewise. * testsuite/Makefile.am (tls_test_shared.so): Add -Wl,-z,defs. * testsuite/Makefile.in: Rebuild. --- gold/ChangeLog | 11 +++++++++++ gold/i386.cc | 2 +- gold/powerpc.cc | 2 +- gold/sparc.cc | 2 +- gold/target-reloc.h | 1 + gold/target.h | 4 ++-- gold/testsuite/Makefile.am | 2 +- gold/testsuite/Makefile.in | 2 +- gold/x86_64.cc | 2 +- 9 files changed, 20 insertions(+), 8 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index dc8407942b..22e4263b9b 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,5 +1,16 @@ 2008-09-16 Ian Lance Taylor + * target-reloc.h (relocate_section): Check whether a symbol is + defined by the ABI before reporting an undefined symbol error. + * target.h (Target::is_defined_by_abi): Make parameter const. + (Target::do_is_defined_by_abi): Likewise. + * i386.cc (Target_i386::do_is_defined_by_abi): Likewise. + * powerpc.cc (Target_powerpc::do_is_defined_by_abi): Likewise. + * sparc.cc (Target_sparc::do_is_defined_by_abi): Likewise. + * x86_64.cc (Target_x86_64::do_is_defined_by_abi): Likewise. + * testsuite/Makefile.am (tls_test_shared.so): Add -Wl,-z,defs. + * testsuite/Makefile.in: Rebuild. + * fileread.cc (make_view): Add casts to avoid warning. 2008-09-16 Alexandre Oliva diff --git a/gold/i386.cc b/gold/i386.cc index e2fbb25878..8a5558ebf3 100644 --- a/gold/i386.cc +++ b/gold/i386.cc @@ -135,7 +135,7 @@ class Target_i386 : public Sized_target<32, false> // Return whether SYM is defined by the ABI. bool - do_is_defined_by_abi(Symbol* sym) const + do_is_defined_by_abi(const Symbol* sym) const { return strcmp(sym->name(), "___tls_get_addr") == 0; } // Return the size of the GOT section. diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 421cfdb206..05ce4fcc1e 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -129,7 +129,7 @@ class Target_powerpc : public Sized_target // Return whether SYM is defined by the ABI. bool - do_is_defined_by_abi(Symbol* sym) const + do_is_defined_by_abi(const Symbol* sym) const { return strcmp(sym->name(), "___tls_get_addr") == 0; } diff --git a/gold/sparc.cc b/gold/sparc.cc index 7da59dd3f8..cca78b794b 100644 --- a/gold/sparc.cc +++ b/gold/sparc.cc @@ -130,7 +130,7 @@ class Target_sparc : public Sized_target section_size_type reloc_view_size); // Return whether SYM is defined by the ABI. bool - do_is_defined_by_abi(Symbol* sym) const + do_is_defined_by_abi(const Symbol* sym) const { // XXX Really need to support this better... if (sym->type() == elfcpp::STT_SPARC_REGISTER) diff --git a/gold/target-reloc.h b/gold/target-reloc.h index 6683ddd05f..1cdc24458a 100644 --- a/gold/target-reloc.h +++ b/gold/target-reloc.h @@ -283,6 +283,7 @@ relocate_section( if (sym != NULL && sym->is_undefined() && sym->binding() != elfcpp::STB_WEAK + && !target->is_defined_by_abi(sym) && (!parameters->options().shared() // -shared || parameters->options().defs())) // -z defs gold_undefined_symbol(sym, relinfo, i, offset); diff --git a/gold/target.h b/gold/target.h index 30fa0086ca..460ac96ecf 100644 --- a/gold/target.h +++ b/gold/target.h @@ -164,7 +164,7 @@ class Target // Return whether SYM is known to be defined by the ABI. This is // used to avoid inappropriate warnings about undefined symbols. bool - is_defined_by_abi(Symbol* sym) const + is_defined_by_abi(const Symbol* sym) const { return this->do_is_defined_by_abi(sym); } protected: @@ -222,7 +222,7 @@ class Target // Virtual function which may be implemented by the child class. virtual bool - do_is_defined_by_abi(Symbol*) const + do_is_defined_by_abi(const Symbol*) const { return false; } private: diff --git a/gold/testsuite/Makefile.am b/gold/testsuite/Makefile.am index c9dd4703a7..1f08b5a30a 100644 --- a/gold/testsuite/Makefile.am +++ b/gold/testsuite/Makefile.am @@ -468,7 +468,7 @@ tls_test_file2_pic.o: tls_test_file2.cc tls_test_c_pic.o: tls_test_c.c $(COMPILE) -c -fpic $(TLS_TEST_C_CFLAGS) -o $@ $< tls_test_shared.so: tls_test_pic.o tls_test_file2_pic.o tls_test_c_pic.o gcctestdir/ld - $(CXXLINK) -Bgcctestdir/ -shared tls_test_pic.o tls_test_file2_pic.o tls_test_c_pic.o + $(CXXLINK) -Bgcctestdir/ -shared tls_test_pic.o tls_test_file2_pic.o tls_test_c_pic.o -Wl,-z,defs tls_test_shared2.so: tls_test_file2_pic.o gcctestdir/ld $(CXXLINK) -Bgcctestdir/ -shared tls_test_file2_pic.o diff --git a/gold/testsuite/Makefile.in b/gold/testsuite/Makefile.in index 9f72b887e9..e3d8dcaef0 100644 --- a/gold/testsuite/Makefile.in +++ b/gold/testsuite/Makefile.in @@ -2125,7 +2125,7 @@ uninstall-am: uninstall-info-am @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@tls_test_c_pic.o: tls_test_c.c @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@ $(COMPILE) -c -fpic $(TLS_TEST_C_CFLAGS) -o $@ $< @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@tls_test_shared.so: tls_test_pic.o tls_test_file2_pic.o tls_test_c_pic.o gcctestdir/ld -@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared tls_test_pic.o tls_test_file2_pic.o tls_test_c_pic.o +@GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared tls_test_pic.o tls_test_file2_pic.o tls_test_c_pic.o -Wl,-z,defs @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@tls_test_shared2.so: tls_test_file2_pic.o gcctestdir/ld @GCC_TRUE@@NATIVE_LINKER_TRUE@@TLS_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared tls_test_file2_pic.o diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 46c4a2227c..69f76a0265 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -139,7 +139,7 @@ class Target_x86_64 : public Sized_target<64, false> // Return whether SYM is defined by the ABI. bool - do_is_defined_by_abi(Symbol* sym) const + do_is_defined_by_abi(const Symbol* sym) const { return strcmp(sym->name(), "__tls_get_addr") == 0; } // Return the size of the GOT section. -- 2.34.1