* target-reloc.h (relocate_section): Check the symbol table index
authorIan Lance Taylor <ian@airs.com>
Wed, 3 Mar 2010 19:31:54 +0000 (19:31 +0000)
committerIan Lance Taylor <ian@airs.com>
Wed, 3 Mar 2010 19:31:54 +0000 (19:31 +0000)
for -1U before setting the local symbol index.
(scan_relocatable_relocs): If copying the relocation, record that
the local symbol is required.
* object.h (Symbol_value::is_output_symtab_index_set): New
function.
(Symbol_value::may_be_discarded_from_output_symtab): New
function.
(Symbol_value::has_output_symtab_entry): New function.
(Symbol_value::needs_output_symtab_entry): Remove.
(Symbol_value::output_symtab_index): Make sure the symbol index is
set.
(Symbol_value::set_output_symtab_index): Make sure the symbol
index is not set.  Make sure the new index is valid.
(Symbol_value::set_must_have_output_symtab_entry): New function.
(Symbol_value::has_output_dynsym_entry): New function.
(Symbol_value::set_output_dynsym_index): Make sure the new index
is valid.
(Sized_relobj::set_must_have_output_symtab_entry): New function.
* object.cc (Sized_relobj::do_count_local_symbols): Only discard a
local symbol if permitted.
(Sized_relobj::do_finalize_local_symbols): Call
is_output_symtab_index_set rather than needs_output_symtab_entry.
(Sized_relobj::write_local_symbols): Call has_output_symtab_entry
rather than needs_output_symtab_entry.  Call
has_output_dynsym_entry rather than needs_output_dynsym_entry.
* arm.cc (Arm_relobj::update_output_local_symbol_count): Call
is_output_symtab_index_set rather than needs_output_symtab_entry.
* testsuite/discard_locals_relocatable_test.c: New file.
* testsuite/discard_locals_test.sh: Test -r.
* testsuite/Makefile.am (check_DATA): Add
discard_locals_relocatable_test1.syms,
discard_local_relocatable_test2.syms.
(MOSTLYCLEANFILES): Likewise.  Also add
discard_locals_relocatable_test1.lout and
discard_locals_relocatable_test2.out.
(discard_locals_relocatable_test1.syms): New target.
(discard_locals_relocatable_test.o): New target.
(discard_locals_relocatable_test1.out): New target.
(discard_locals_relocatable_test2.syms): New target.
(discard_locals_relocatable_test2.out): New target.
(various): Add missing ../ld-new dependencies.
* testsuite/Makefile.in: Rebuild.

gold/ChangeLog
gold/arm.cc
gold/object.cc
gold/object.h
gold/target-reloc.h
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in
gold/testsuite/discard_locals_relocatable_test.c [new file with mode: 0644]
gold/testsuite/discard_locals_test.sh

index ee5ee48993d423aad795c40350e455d2c5184ba0..2610909fe66b4f6abb4b2a99dda4d6069e18ef3f 100644 (file)
@@ -1,3 +1,50 @@
+2010-03-03  Viktor Kutuzov  <vkutuzov@accesssoftek.com>
+           Ian Lance Taylor  <iant@google.com>
+
+       * target-reloc.h (relocate_section): Check the symbol table index
+       for -1U before setting the local symbol index.
+       (scan_relocatable_relocs): If copying the relocation, record that
+       the local symbol is required.
+       * object.h (Symbol_value::is_output_symtab_index_set): New
+       function.
+       (Symbol_value::may_be_discarded_from_output_symtab): New
+       function.
+       (Symbol_value::has_output_symtab_entry): New function.
+       (Symbol_value::needs_output_symtab_entry): Remove.
+       (Symbol_value::output_symtab_index): Make sure the symbol index is
+       set.
+       (Symbol_value::set_output_symtab_index): Make sure the symbol
+       index is not set.  Make sure the new index is valid.
+       (Symbol_value::set_must_have_output_symtab_entry): New function.
+       (Symbol_value::has_output_dynsym_entry): New function.
+       (Symbol_value::set_output_dynsym_index): Make sure the new index
+       is valid.
+       (Sized_relobj::set_must_have_output_symtab_entry): New function.
+       * object.cc (Sized_relobj::do_count_local_symbols): Only discard a
+       local symbol if permitted.
+       (Sized_relobj::do_finalize_local_symbols): Call
+       is_output_symtab_index_set rather than needs_output_symtab_entry.
+       (Sized_relobj::write_local_symbols): Call has_output_symtab_entry
+       rather than needs_output_symtab_entry.  Call
+       has_output_dynsym_entry rather than needs_output_dynsym_entry.
+       * arm.cc (Arm_relobj::update_output_local_symbol_count): Call
+       is_output_symtab_index_set rather than needs_output_symtab_entry.
+       * testsuite/discard_locals_relocatable_test.c: New file.
+       * testsuite/discard_locals_test.sh: Test -r.
+       * testsuite/Makefile.am (check_DATA): Add
+       discard_locals_relocatable_test1.syms,
+       discard_local_relocatable_test2.syms.
+       (MOSTLYCLEANFILES): Likewise.  Also add
+       discard_locals_relocatable_test1.lout and
+       discard_locals_relocatable_test2.out.
+       (discard_locals_relocatable_test1.syms): New target.
+       (discard_locals_relocatable_test.o): New target.
+       (discard_locals_relocatable_test1.out): New target.
+       (discard_locals_relocatable_test2.syms): New target.
+       (discard_locals_relocatable_test2.out): New target.
+       (various): Add missing ../ld-new dependencies.
+       * testsuite/Makefile.in: Rebuild.
+
 2010-03-03  Nick Clifton  <nickc@redhat.com>
 
        * po/fi.po: New Finnish translation.
index bba6e280986efe835fe0c9cf12e1fd2db813ae6c..c141bc010f9803bf02523949b030688ffbe73f83 100644 (file)
@@ -6506,7 +6506,7 @@ Arm_relobj<big_endian>::update_output_local_symbol_count()
       Symbol_value<32>& lv((*this->local_values())[i]);
 
       // This local symbol was already discarded by do_count_local_symbols.
-      if (!lv.needs_output_symtab_entry())
+      if (!lv.is_output_symtab_index_set())
        continue;
 
       bool is_ordinary;
index 85353cfdf9129f279deb4f5b94619db15459c24f..73bf3702c9e103908f123808ada142d56846c8dd 100644 (file)
@@ -1591,7 +1591,7 @@ Sized_relobj<size, big_endian>::do_count_local_symbols(Stringpool* pool,
           ++dyncount;
         }
 
-      if (discard_all)
+      if (discard_all && lv.may_be_discarded_from_output_symtab())
        {
          lv.set_no_output_symtab_entry();
          continue;
@@ -1612,6 +1612,7 @@ Sized_relobj<size, big_endian>::do_count_local_symbols(Stringpool* pool,
       if (discard_locals
          && sym.get_st_type() != elfcpp::STT_FILE
          && !lv.needs_output_dynsym_entry()
+         && lv.may_be_discarded_from_output_symtab()
          && parameters->target().is_local_label_name(name))
        {
          lv.set_no_output_symtab_entry();
@@ -1774,7 +1775,7 @@ Sized_relobj<size, big_endian>::do_finalize_local_symbols(unsigned int index,
                                + lv.input_value());
        }
 
-      if (lv.needs_output_symtab_entry())
+      if (!lv.is_output_symtab_index_set())
         {
           lv.set_output_symtab_index(index);
           ++index;
@@ -1937,16 +1938,16 @@ Sized_relobj<size, big_endian>::write_local_symbols(
          st_shndx = out_sections[st_shndx]->out_shndx();
          if (st_shndx >= elfcpp::SHN_LORESERVE)
            {
-             if (lv.needs_output_symtab_entry() && !strip_all)
+             if (lv.has_output_symtab_entry())
                symtab_xindex->add(lv.output_symtab_index(), st_shndx);
-             if (lv.needs_output_dynsym_entry())
+             if (lv.has_output_dynsym_entry())
                dynsym_xindex->add(lv.output_dynsym_index(), st_shndx);
              st_shndx = elfcpp::SHN_XINDEX;
            }
        }
 
       // Write the symbol to the output symbol table.
-      if (!strip_all && lv.needs_output_symtab_entry())
+      if (lv.has_output_symtab_entry())
         {
           elfcpp::Sym_write<size, big_endian> osym(ov);
 
@@ -1963,7 +1964,7 @@ Sized_relobj<size, big_endian>::write_local_symbols(
         }
 
       // Write the symbol to the output dynamic symbol table.
-      if (lv.needs_output_dynsym_entry())
+      if (lv.has_output_dynsym_entry())
         {
           gold_assert(dyn_ov < dyn_oview + dyn_output_size);
           elfcpp::Sym_write<size, big_endian> osym(dyn_ov);
index 1be5471b4bb730a1ab2adfa43a12e39bf52f2202..59da7c1c5f354cfe69ad2fa0cdeb43cce3a98567 100644 (file)
@@ -1087,17 +1087,39 @@ class Symbol_value
   input_value() const
   { return this->u_.value; }
 
-  // Return whether this symbol should go into the output symbol
+  // Return whether we have set the index in the output symbol table
+  // yet.
+  bool
+  is_output_symtab_index_set() const
+  {
+    return (this->output_symtab_index_ != 0
+           && this->output_symtab_index_ != -2U);
+  }
+
+  // Return whether this symbol may be discarded from the normal
+  // symbol table.
+  bool
+  may_be_discarded_from_output_symtab() const
+  {
+    gold_assert(!this->is_output_symtab_index_set());
+    return this->output_symtab_index_ != -2U;
+  }
+
+  // Return whether this symbol has an entry in the output symbol
   // table.
   bool
-  needs_output_symtab_entry() const
-  { return this->output_symtab_index_ != -1U; }
+  has_output_symtab_entry() const
+  {
+    gold_assert(this->is_output_symtab_index_set());
+    return this->output_symtab_index_ != -1U;
+  }
 
   // Return the index in the output symbol table.
   unsigned int
   output_symtab_index() const
   {
-    gold_assert(this->output_symtab_index_ != 0);
+    gold_assert(this->is_output_symtab_index_set()
+               && this->output_symtab_index_ != -1U);
     return this->output_symtab_index_;
   }
 
@@ -1105,7 +1127,8 @@ class Symbol_value
   void
   set_output_symtab_index(unsigned int i)
   {
-    gold_assert(this->output_symtab_index_ == 0);
+    gold_assert(!this->is_output_symtab_index_set());
+    gold_assert(i != 0 && i != -1U && i != -2U);
     this->output_symtab_index_ = i;
   }
 
@@ -1118,6 +1141,15 @@ class Symbol_value
     this->output_symtab_index_ = -1U;
   }
 
+  // Record that this symbol must go into the output symbol table,
+  // because it there is a relocation that uses it.
+  void
+  set_must_have_output_symtab_entry()
+  {
+    gold_assert(!this->is_output_symtab_index_set());
+    this->output_symtab_index_ = -2U;
+  }
+
   // Set the index in the output dynamic symbol table.
   void
   set_needs_output_dynsym_entry()
@@ -1126,7 +1158,7 @@ class Symbol_value
     this->output_dynsym_index_ = 0;
   }
 
-  // Return whether this symbol should go into the output symbol
+  // Return whether this symbol should go into the dynamic symbol
   // table.
   bool
   needs_output_dynsym_entry() const
@@ -1134,11 +1166,21 @@ class Symbol_value
     return this->output_dynsym_index_ != -1U;
   }
 
+  // Return whether this symbol has an entry in the dynamic symbol
+  // table.
+  bool
+  has_output_dynsym_entry() const
+  {
+    gold_assert(this->output_dynsym_index_ != 0);
+    return this->output_dynsym_index_ != -1U;
+  }
+
   // Record that this symbol should go into the dynamic symbol table.
   void
   set_output_dynsym_index(unsigned int i)
   {
     gold_assert(this->output_dynsym_index_ == 0);
+    gold_assert(i != 0 && i != -1U);
     this->output_dynsym_index_ = i;
   }
 
@@ -1195,10 +1237,13 @@ class Symbol_value
 
  private:
   // The index of this local symbol in the output symbol table.  This
-  // will be -1 if the symbol should not go into the symbol table.
+  // will be 0 if no value has been assigned yet, and the symbol may
+  // be omitted.  This will be -1U if the symbol should not go into
+  // the symbol table.  This will be -2U if the symbol must go into
+  // the symbol table, but no index has been assigned yet.
   unsigned int output_symtab_index_;
   // The index of this local symbol in the dynamic symbol table.  This
-  // will be -1 if the symbol should not go into the symbol table.
+  // will be -1U if the symbol should not go into the symbol table.
   unsigned int output_dynsym_index_;
   // The section index in the input file in which this symbol is
   // defined.
@@ -1421,6 +1466,14 @@ class Sized_relobj : public Relobj
     return this->local_values_[sym].input_shndx(is_ordinary);
   }
 
+  // Record that local symbol SYM must be in the output symbol table.
+  void
+  set_must_have_output_symtab_entry(unsigned int sym)
+  {
+    gold_assert(sym < this->local_values_.size());
+    this->local_values_[sym].set_must_have_output_symtab_entry();
+  }
+
   // Record that local symbol SYM needs a dynamic symbol entry.
   void
   set_needs_output_dynsym_entry(unsigned int sym)
index 4cb331536fe132ba53ba273ed107ef4eed52be0a..510eea051fd92979cf627e459731312268dac902 100644 (file)
@@ -279,7 +279,7 @@ relocate_section(
            }
 
          sym = static_cast<const Sized_symbol<size>*>(gsym);
-         if (sym->has_symtab_index())
+         if (sym->has_symtab_index() && sym->symtab_index() != -1U)
            symval.set_output_symtab_index(sym->symtab_index());
          else
            symval.set_no_output_symtab_entry();
@@ -491,6 +491,9 @@ scan_relocatable_relocs(
                  if (strategy != Relocatable_relocs::RELOC_DISCARD)
                     object->output_section(shndx)->set_needs_symtab_index();
                }
+
+             if (strategy == Relocatable_relocs::RELOC_COPY)
+               object->set_must_have_output_symtab_entry(r_sym);
            }
        }
 
index c9e2d1c45322f0e23f0ed35d6d491a9de3ca1d98..a083bc4a017c477b7a1b020604e83f3cc0cb7038 100644 (file)
@@ -1285,8 +1285,14 @@ local_labels_test: local_labels_test.o
 
 check_PROGRAMS += discard_locals_test
 check_SCRIPTS += discard_locals_test.sh
-check_DATA += discard_locals_test.syms
-MOSTLYCLEANFILES += discard_locals_test.syms
+check_DATA += discard_locals_test.syms \
+       discard_locals_relocatable_test1.syms \
+       discard_locals_relocatable_test2.syms
+MOSTLYCLEANFILES += discard_locals_test.syms \
+       discard_locals_relocatable_test1.syms \
+       discard_locals_relocatable_test2.syms \
+       discard_locals_relocatable_test1.out \
+       discard_locals_relocatable_test2.out
 discard_locals_test_SOURCES = discard_locals_test.c
 discard_locals_test_LDFLAGS = -Bgcctestdir/ -Wl,--discard-locals
 discard_locals_test.syms: discard_locals_test
@@ -1295,6 +1301,18 @@ discard_locals_test.syms: discard_locals_test
 discard_locals_test.o: discard_locals_test.c
        $(COMPILE) -c -Wa,-L -o $@ $<
 
+discard_locals_relocatable_test1.syms: discard_locals_relocatable_test1.out
+       $(TEST_READELF) -sW $< >$@ 2>/dev/null
+discard_locals_relocatable_test.o: discard_locals_relocatable_test.c
+       $(COMPILE) -c -Wa,-L -fPIC -o $@ $<
+discard_locals_relocatable_test1.out: discard_locals_relocatable_test.o ../ld-new
+       ../ld-new --discard-locals -relocatable -o $@ $<
+
+discard_locals_relocatable_test2.syms: discard_locals_relocatable_test2.out
+       $(TEST_READELF) -sW $< >$@ 2>/dev/null
+discard_locals_relocatable_test2.out: discard_locals_relocatable_test.o ../ld-new
+       ../ld-new --discard-all -relocatable -o $@ $<
+
 if MCMODEL_MEDIUM
 check_PROGRAMS += large
 large_SOURCES = large.c
@@ -1456,11 +1474,11 @@ check_SCRIPTS += arm_abs_global.sh
 check_DATA += arm_abs_global.stdout
 arm_abs_lib.o: arm_abs_lib.s
        $(TEST_AS) -march=armv7-a -o $@ $<
-libarm_abs.so: arm_abs_lib.o
+libarm_abs.so: arm_abs_lib.o ../ld-new
        ../ld-new -shared -o $@ arm_abs_lib.o
 arm_abs_global.o: arm_abs_global.s
        $(TEST_AS) -march=armv7-a -o $@ $<
-arm_abs_global: arm_abs_global.o libarm_abs.so
+arm_abs_global: arm_abs_global.o libarm_abs.so ../ld-new
        ../ld-new -o $@ arm_abs_global.o -L. -larm_abs
 arm_abs_global.stdout: arm_abs_global
        $(TEST_READELF) -r $< > $@
@@ -1475,7 +1493,7 @@ check_DATA += arm_bl_in_range.stdout arm_bl_out_of_range.stdout \
 arm_bl_in_range.stdout: arm_bl_in_range
        $(TEST_OBJDUMP) -D $< > $@
 
-arm_bl_in_range: arm_bl_in_range.o
+arm_bl_in_range: arm_bl_in_range.o ../ld-new
        ../ld-new -T $(srcdir)/arm_branch_range.t -o $@ $<
 
 arm_bl_in_range.o: arm_bl_in_range.s
@@ -1484,7 +1502,7 @@ arm_bl_in_range.o: arm_bl_in_range.s
 arm_bl_out_of_range.stdout: arm_bl_out_of_range
        $(TEST_OBJDUMP) -S $< > $@
 
-arm_bl_out_of_range: arm_bl_out_of_range.o
+arm_bl_out_of_range: arm_bl_out_of_range.o ../ld-new
        ../ld-new -T $(srcdir)/arm_branch_range.t -o $@ $<
 
 arm_bl_out_of_range.o: arm_bl_out_of_range.s
@@ -1493,7 +1511,7 @@ arm_bl_out_of_range.o: arm_bl_out_of_range.s
 thumb_bl_in_range.stdout: thumb_bl_in_range
        $(TEST_OBJDUMP) -D $< > $@
 
-thumb_bl_in_range: thumb_bl_in_range.o
+thumb_bl_in_range: thumb_bl_in_range.o ../ld-new
        ../ld-new -T $(srcdir)/thumb_branch_range.t -o $@ $<
 
 thumb_bl_in_range.o: thumb_bl_in_range.s
@@ -1502,7 +1520,7 @@ thumb_bl_in_range.o: thumb_bl_in_range.s
 thumb_bl_out_of_range.stdout: thumb_bl_out_of_range
        $(TEST_OBJDUMP) -D $< > $@
 
-thumb_bl_out_of_range: thumb_bl_in_range.o
+thumb_bl_out_of_range: thumb_bl_in_range.o ../ld-new
        ../ld-new -T $(srcdir)/thumb_branch_range.t -o $@ $<
 
 thumb_bl_out_of_range.o: thumb_bl_in_range.s
@@ -1511,7 +1529,7 @@ thumb_bl_out_of_range.o: thumb_bl_in_range.s
 thumb2_bl_in_range.stdout: thumb2_bl_in_range
        $(TEST_OBJDUMP) -D $< > $@
 
-thumb2_bl_in_range: thumb2_bl_in_range.o
+thumb2_bl_in_range: thumb2_bl_in_range.o ../ld-new
        ../ld-new -T $(srcdir)/thumb2_branch_range.t -o $@ $<
 
 thumb2_bl_in_range.o: thumb_bl_in_range.s
@@ -1520,7 +1538,7 @@ thumb2_bl_in_range.o: thumb_bl_in_range.s
 thumb2_bl_out_of_range.stdout: thumb2_bl_out_of_range
        $(TEST_OBJDUMP) -D $< > $@
 
-thumb2_bl_out_of_range: thumb2_bl_in_range.o
+thumb2_bl_out_of_range: thumb2_bl_in_range.o ../ld-new
        ../ld-new -T $(srcdir)/thumb2_branch_range.t -o $@ $<
 
 thumb2_bl_out_of_range.o: thumb_bl_in_range.s
@@ -1536,7 +1554,7 @@ check_DATA += arm_fix_v4bx.stdout arm_fix_v4bx_interworking.stdout \
 arm_fix_v4bx.stdout: arm_fix_v4bx
        $(TEST_OBJDUMP) -D -j.text $< > $@
 
-arm_fix_v4bx: arm_fix_v4bx.o
+arm_fix_v4bx: arm_fix_v4bx.o ../ld-new
        ../ld-new --fix-v4bx -o $@ $<
 
 arm_fix_v4bx.o: arm_fix_v4bx.s
@@ -1545,13 +1563,13 @@ arm_fix_v4bx.o: arm_fix_v4bx.s
 arm_fix_v4bx_interworking.stdout: arm_fix_v4bx_interworking
        $(TEST_OBJDUMP) -D -j.text $< > $@
 
-arm_fix_v4bx_interworking: arm_fix_v4bx.o
+arm_fix_v4bx_interworking: arm_fix_v4bx.o ../ld-new
        ../ld-new --fix-v4bx-interworking -o $@ $<
 
 arm_no_fix_v4bx.stdout: arm_no_fix_v4bx
        $(TEST_OBJDUMP) -D -j.text $< > $@
 
-arm_no_fix_v4bx: arm_fix_v4bx.o
+arm_no_fix_v4bx: arm_fix_v4bx.o ../ld-new
        ../ld-new -o $@ $<
 
 MOSTLYCLEANFILES += arm_fix_v4bx arm_fix_v4bx_interworking arm_no_fix_v4bx
index 10730f3098aefa8d8254e816564b2e640e86a9ea..d21b32be7df4aede808593624d11d77f5d6eadb8 100644 (file)
@@ -276,6 +276,8 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ no_version_test.sh
 @GCC_TRUE@@NATIVE_LINKER_TRUE@am__append_28 = exclude_libs_test.syms \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ discard_locals_test.syms \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ discard_locals_relocatable_test1.syms \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ discard_locals_relocatable_test2.syms \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ hidden_test.err \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ retain_symbols_file_test.stdout \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ no_version_test.stdout
@@ -284,6 +286,10 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ libexclude_libs_test_2.a \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ alt/libexclude_libs_test_3.a \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ discard_locals_test.syms \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ discard_locals_relocatable_test1.syms \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ discard_locals_relocatable_test2.syms \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ discard_locals_relocatable_test1.out \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ discard_locals_relocatable_test2.out \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ hidden_test hidden_test.err \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ retain_symbols_file_test \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ retain_symbols_file_test.in \
@@ -3142,6 +3148,18 @@ uninstall-am:
 # '-Wa,-L' is required to preserve the local label used for testing.
 @GCC_TRUE@@NATIVE_LINKER_TRUE@discard_locals_test.o: discard_locals_test.c
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(COMPILE) -c -Wa,-L -o $@ $<
+
+@GCC_TRUE@@NATIVE_LINKER_TRUE@discard_locals_relocatable_test1.syms: discard_locals_relocatable_test1.out
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_READELF) -sW $< >$@ 2>/dev/null
+@GCC_TRUE@@NATIVE_LINKER_TRUE@discard_locals_relocatable_test.o: discard_locals_relocatable_test.c
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(COMPILE) -c -Wa,-L -fPIC -o $@ $<
+@GCC_TRUE@@NATIVE_LINKER_TRUE@discard_locals_relocatable_test1.out: discard_locals_relocatable_test.o ../ld-new
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ ../ld-new --discard-locals -relocatable -o $@ $<
+
+@GCC_TRUE@@NATIVE_LINKER_TRUE@discard_locals_relocatable_test2.syms: discard_locals_relocatable_test2.out
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_READELF) -sW $< >$@ 2>/dev/null
+@GCC_TRUE@@NATIVE_LINKER_TRUE@discard_locals_relocatable_test2.out: discard_locals_relocatable_test.o ../ld-new
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ ../ld-new --discard-all -relocatable -o $@ $<
 @GCC_TRUE@@NATIVE_LINKER_TRUE@libhidden.so: hidden_test_1.c gcctestdir/ld
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(COMPILE) -Bgcctestdir/ -g -shared -fPIC -w -o $@ $(srcdir)/hidden_test_1.c
 @GCC_TRUE@@NATIVE_LINKER_TRUE@hidden_test: hidden_test_main.o libhidden.so gcctestdir/ld
@@ -3231,11 +3249,11 @@ uninstall-am:
 @DEFAULT_TARGET_X86_64_TRUE@   ../ld-new -r split_x86_64_1.o split_x86_64_n.o -o split_x86_64_r > $@ 2>&1 || exit 0
 @DEFAULT_TARGET_ARM_TRUE@arm_abs_lib.o: arm_abs_lib.s
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_AS) -march=armv7-a -o $@ $<
-@DEFAULT_TARGET_ARM_TRUE@libarm_abs.so: arm_abs_lib.o
+@DEFAULT_TARGET_ARM_TRUE@libarm_abs.so: arm_abs_lib.o ../ld-new
 @DEFAULT_TARGET_ARM_TRUE@      ../ld-new -shared -o $@ arm_abs_lib.o
 @DEFAULT_TARGET_ARM_TRUE@arm_abs_global.o: arm_abs_global.s
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_AS) -march=armv7-a -o $@ $<
-@DEFAULT_TARGET_ARM_TRUE@arm_abs_global: arm_abs_global.o libarm_abs.so
+@DEFAULT_TARGET_ARM_TRUE@arm_abs_global: arm_abs_global.o libarm_abs.so ../ld-new
 @DEFAULT_TARGET_ARM_TRUE@      ../ld-new -o $@ arm_abs_global.o -L. -larm_abs
 @DEFAULT_TARGET_ARM_TRUE@arm_abs_global.stdout: arm_abs_global
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_READELF) -r $< > $@
@@ -3243,7 +3261,7 @@ uninstall-am:
 @DEFAULT_TARGET_ARM_TRUE@arm_bl_in_range.stdout: arm_bl_in_range
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_OBJDUMP) -D $< > $@
 
-@DEFAULT_TARGET_ARM_TRUE@arm_bl_in_range: arm_bl_in_range.o
+@DEFAULT_TARGET_ARM_TRUE@arm_bl_in_range: arm_bl_in_range.o ../ld-new
 @DEFAULT_TARGET_ARM_TRUE@      ../ld-new -T $(srcdir)/arm_branch_range.t -o $@ $<
 
 @DEFAULT_TARGET_ARM_TRUE@arm_bl_in_range.o: arm_bl_in_range.s
@@ -3252,7 +3270,7 @@ uninstall-am:
 @DEFAULT_TARGET_ARM_TRUE@arm_bl_out_of_range.stdout: arm_bl_out_of_range
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_OBJDUMP) -S $< > $@
 
-@DEFAULT_TARGET_ARM_TRUE@arm_bl_out_of_range: arm_bl_out_of_range.o
+@DEFAULT_TARGET_ARM_TRUE@arm_bl_out_of_range: arm_bl_out_of_range.o ../ld-new
 @DEFAULT_TARGET_ARM_TRUE@      ../ld-new -T $(srcdir)/arm_branch_range.t -o $@ $<
 
 @DEFAULT_TARGET_ARM_TRUE@arm_bl_out_of_range.o: arm_bl_out_of_range.s
@@ -3261,7 +3279,7 @@ uninstall-am:
 @DEFAULT_TARGET_ARM_TRUE@thumb_bl_in_range.stdout: thumb_bl_in_range
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_OBJDUMP) -D $< > $@
 
-@DEFAULT_TARGET_ARM_TRUE@thumb_bl_in_range: thumb_bl_in_range.o
+@DEFAULT_TARGET_ARM_TRUE@thumb_bl_in_range: thumb_bl_in_range.o ../ld-new
 @DEFAULT_TARGET_ARM_TRUE@      ../ld-new -T $(srcdir)/thumb_branch_range.t -o $@ $<
 
 @DEFAULT_TARGET_ARM_TRUE@thumb_bl_in_range.o: thumb_bl_in_range.s
@@ -3270,7 +3288,7 @@ uninstall-am:
 @DEFAULT_TARGET_ARM_TRUE@thumb_bl_out_of_range.stdout: thumb_bl_out_of_range
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_OBJDUMP) -D $< > $@
 
-@DEFAULT_TARGET_ARM_TRUE@thumb_bl_out_of_range: thumb_bl_in_range.o
+@DEFAULT_TARGET_ARM_TRUE@thumb_bl_out_of_range: thumb_bl_in_range.o ../ld-new
 @DEFAULT_TARGET_ARM_TRUE@      ../ld-new -T $(srcdir)/thumb_branch_range.t -o $@ $<
 
 @DEFAULT_TARGET_ARM_TRUE@thumb_bl_out_of_range.o: thumb_bl_in_range.s
@@ -3279,7 +3297,7 @@ uninstall-am:
 @DEFAULT_TARGET_ARM_TRUE@thumb2_bl_in_range.stdout: thumb2_bl_in_range
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_OBJDUMP) -D $< > $@
 
-@DEFAULT_TARGET_ARM_TRUE@thumb2_bl_in_range: thumb2_bl_in_range.o
+@DEFAULT_TARGET_ARM_TRUE@thumb2_bl_in_range: thumb2_bl_in_range.o ../ld-new
 @DEFAULT_TARGET_ARM_TRUE@      ../ld-new -T $(srcdir)/thumb2_branch_range.t -o $@ $<
 
 @DEFAULT_TARGET_ARM_TRUE@thumb2_bl_in_range.o: thumb_bl_in_range.s
@@ -3288,7 +3306,7 @@ uninstall-am:
 @DEFAULT_TARGET_ARM_TRUE@thumb2_bl_out_of_range.stdout: thumb2_bl_out_of_range
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_OBJDUMP) -D $< > $@
 
-@DEFAULT_TARGET_ARM_TRUE@thumb2_bl_out_of_range: thumb2_bl_in_range.o
+@DEFAULT_TARGET_ARM_TRUE@thumb2_bl_out_of_range: thumb2_bl_in_range.o ../ld-new
 @DEFAULT_TARGET_ARM_TRUE@      ../ld-new -T $(srcdir)/thumb2_branch_range.t -o $@ $<
 
 @DEFAULT_TARGET_ARM_TRUE@thumb2_bl_out_of_range.o: thumb_bl_in_range.s
@@ -3297,7 +3315,7 @@ uninstall-am:
 @DEFAULT_TARGET_ARM_TRUE@arm_fix_v4bx.stdout: arm_fix_v4bx
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_OBJDUMP) -D -j.text $< > $@
 
-@DEFAULT_TARGET_ARM_TRUE@arm_fix_v4bx: arm_fix_v4bx.o
+@DEFAULT_TARGET_ARM_TRUE@arm_fix_v4bx: arm_fix_v4bx.o ../ld-new
 @DEFAULT_TARGET_ARM_TRUE@      ../ld-new --fix-v4bx -o $@ $<
 
 @DEFAULT_TARGET_ARM_TRUE@arm_fix_v4bx.o: arm_fix_v4bx.s
@@ -3306,13 +3324,13 @@ uninstall-am:
 @DEFAULT_TARGET_ARM_TRUE@arm_fix_v4bx_interworking.stdout: arm_fix_v4bx_interworking
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_OBJDUMP) -D -j.text $< > $@
 
-@DEFAULT_TARGET_ARM_TRUE@arm_fix_v4bx_interworking: arm_fix_v4bx.o
+@DEFAULT_TARGET_ARM_TRUE@arm_fix_v4bx_interworking: arm_fix_v4bx.o ../ld-new
 @DEFAULT_TARGET_ARM_TRUE@      ../ld-new --fix-v4bx-interworking -o $@ $<
 
 @DEFAULT_TARGET_ARM_TRUE@arm_no_fix_v4bx.stdout: arm_no_fix_v4bx
 @DEFAULT_TARGET_ARM_TRUE@      $(TEST_OBJDUMP) -D -j.text $< > $@
 
-@DEFAULT_TARGET_ARM_TRUE@arm_no_fix_v4bx: arm_fix_v4bx.o
+@DEFAULT_TARGET_ARM_TRUE@arm_no_fix_v4bx: arm_fix_v4bx.o ../ld-new
 @DEFAULT_TARGET_ARM_TRUE@      ../ld-new -o $@ $<
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
diff --git a/gold/testsuite/discard_locals_relocatable_test.c b/gold/testsuite/discard_locals_relocatable_test.c
new file mode 100644 (file)
index 0000000..d46151e
--- /dev/null
@@ -0,0 +1,43 @@
+/* discard_locals_relocatable_test.c -- test --discard-locals/--discard-all -r
+
+   Copyright 2010 Free Software Foundation, Inc.
+   Viktor Kutuzov <vkutuzov@accesssoftek.com>.
+
+   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.
+
+   This is a test of a common symbol in the main program and a
+   versioned symbol in a shared library.  The common symbol in the
+   main program should override the shared library symbol.  */
+
+/* Note: use GCC -fPIC option to compile this test.  */
+
+/* Local symbol format for generic ELF target. 
+   Use GCC -Wa,-L option to preserve this local symbol
+   in the output object file. */
+asm (".Lshould_be_discarded:");
+
+extern void print_func (const char* s);
+
+extern int func (void);
+
+int
+func (void)
+{
+  print_func ("local string");
+  return 0;
+}
index c09f833d340fa4d1ebf3adea6598957532e37fff..3fc679a45855622a0cb09fccf7b4361b3e6d4804 100755 (executable)
 # the resulting executable and check that symbols from two test library
 # archives are correctly hidden or left unmodified.
 
-check()
+check_discarded()
 {
     file=$1
+    sym=$2
 
-    found=`egrep "should_be_discarded" $file`
+    found=`egrep $sym $file`
     if test -n "$found"; then
        echo "These local symbols are not discarded in $file:"
        echo "$found"
@@ -39,6 +40,24 @@ check()
     fi
 }
 
-check "discard_locals_test.syms"
+check_non_discarded()
+{
+    file=$1
+    sym=$2
+
+    found=`egrep $sym $file`
+    if test -z "$found"; then
+       echo "This local symbol is discarded in $file:"
+       echo "$2"
+       exit 1
+    fi
+}
+
+check_discarded     "discard_locals_test.syms" "should_be_discarded"
+
+check_non_discarded "discard_locals_relocatable_test1.syms" ".LC0"
+check_discarded     "discard_locals_relocatable_test1.syms" "should_be_discarded"
+check_non_discarded "discard_locals_relocatable_test2.syms" ".LC0"
+check_discarded     "discard_locals_relocatable_test2.syms" "should_be_discarded"
 
 exit 0