* target-reloc.h (relocate_section): Check whether a symbol is
authorIan Lance Taylor <ian@airs.com>
Tue, 16 Sep 2008 17:23:37 +0000 (17:23 +0000)
committerIan Lance Taylor <ian@airs.com>
Tue, 16 Sep 2008 17:23:37 +0000 (17:23 +0000)
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
gold/i386.cc
gold/powerpc.cc
gold/sparc.cc
gold/target-reloc.h
gold/target.h
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in
gold/x86_64.cc

index dc8407942b6d15afc084996f48c1ab0fccbb18bb..22e4263b9b5e70ccfa723aece6c48b459e6aab7b 100644 (file)
@@ -1,5 +1,16 @@
 2008-09-16  Ian Lance Taylor  <iant@google.com>
 
+       * 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  <aoliva@redhat.com>
index e2fbb258786150563594047df4504942d9ed3bc4..8a5558ebf37e6961b2e55abee259c708b9d3a452 100644 (file)
@@ -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.
index 421cfdb206a34da876d605eb3bbf37af91eff0f2..05ce4fcc1ecfe60b3c97f2f07cd9e9456a5c8218 100644 (file)
@@ -129,7 +129,7 @@ class Target_powerpc : public Sized_target<size, big_endian>
 
   // 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;
   }
index 7da59dd3f84afaff4dfd17578b8ac0e9ed493d8b..cca78b794b809d9c425dcbef37bfd31971e3fc73 100644 (file)
@@ -130,7 +130,7 @@ class Target_sparc : public Sized_target<size, big_endian>
                           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)
index 6683ddd05fd9294cda2e6be50a00f5a9cb84804c..1cdc24458a640e4a6d04acaeda9bb046ec39a73b 100644 (file)
@@ -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);
index 30fa0086ca638eca16a2684f35af2deab81692c1..460ac96ecff65a4892760a429a83a87e42805666 100644 (file)
@@ -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:
index c9dd4703a78b76edcefbe8886eee8a7346ca5034..1f08b5a30a9d44298b2f6ebd6f8760c0ba8460d1 100644 (file)
@@ -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
 
index 9f72b887e94c8ed760b65e72f8c761219377e25b..e3d8dcaef040deac0188f3e2f6d5ca73d87bd826 100644 (file)
@@ -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
 
index 46c4a2227c7a9728eb86301aa9613b78f3dc59af..69f76a0265f2e51d48c02a214bb870daccad9829 100644 (file)
@@ -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.