PR 11866
authorIan Lance Taylor <ian@airs.com>
Mon, 2 Aug 2010 11:59:11 +0000 (11:59 +0000)
committerIan Lance Taylor <ian@airs.com>
Mon, 2 Aug 2010 11:59:11 +0000 (11:59 +0000)
* output.cc (Output_segment::set_offset): Search for the first and
last sections rather than assuming that the list is in order.
(Output_segment::find_first_and_last_list): New function.
* output.h (class Output_segment): Update declarations.
* testsuite/Makefile.am (check_PROGRAMS): Add relro_strip_test.
(relro_strip_test_SOURCES): New variable.
(relro_strip_test_DEPENDENCIES): New variable.
(relro_strip_test_LDFLAGS): New variable.
(relro_strip_test_LDADD): New variable.
(relro_strip_test.so): New target.

gold/ChangeLog
gold/output.cc
gold/output.h
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in

index 2a5a2891e7bc81d840d2829aee12225f8a74afa5..97f7977495a88bfab3ec27f36d2f9acabe2ace3b 100644 (file)
@@ -1,3 +1,17 @@
+2010-08-02  Ian Lance Taylor  <iant@google.com>
+
+       PR 11866
+       * output.cc (Output_segment::set_offset): Search for the first and
+       last sections rather than assuming that the list is in order.
+       (Output_segment::find_first_and_last_list): New function.
+       * output.h (class Output_segment): Update declarations.
+       * testsuite/Makefile.am (check_PROGRAMS): Add relro_strip_test.
+       (relro_strip_test_SOURCES): New variable.
+       (relro_strip_test_DEPENDENCIES): New variable.
+       (relro_strip_test_LDFLAGS): New variable.
+       (relro_strip_test_LDADD): New variable.
+       (relro_strip_test.so): New target.
+
 2010-08-02  Ian Lance Taylor  <iant@google.com>
 
        * i386.cc (class Target_i386): Add got_tlsdesc_ field.
index a487eb8689cdff0a61b029d45f687c991be98638..506edf7afe3156355a0b526fc34b44ba2af1cdb1 100644 (file)
@@ -4042,11 +4042,14 @@ Output_segment::set_offset(unsigned int increase)
       return;
     }
 
-  const Output_data* first;
-  if (this->output_data_.empty())
-    first = this->output_bss_.front();
-  else
-    first = this->output_data_.front();
+  // Find the first and last section by address.  The sections may
+  // have been sorted for the PT_LOAD segment.
+  const Output_data* first = NULL;
+  const Output_data* last_data = NULL;
+  const Output_data* last_bss = NULL;
+  this->find_first_and_last_list(&this->output_data_, &first, &last_data);
+  this->find_first_and_last_list(&this->output_bss_, &first, &last_bss);
+
   this->vaddr_ = first->address();
   this->paddr_ = (first->has_load_address()
                  ? first->load_address()
@@ -4057,18 +4060,11 @@ Output_segment::set_offset(unsigned int increase)
   if (this->output_data_.empty())
     this->filesz_ = 0;
   else
-    {
-      const Output_data* last_data = this->output_data_.back();
-      this->filesz_ = (last_data->address()
-                      + last_data->data_size()
-                      - this->vaddr_);
-    }
+    this->filesz_ = (last_data->address()
+                    + last_data->data_size()
+                    - this->vaddr_);
 
-  const Output_data* last;
-  if (this->output_bss_.empty())
-    last = this->output_data_.back();
-  else
-    last = this->output_bss_.back();
+  const Output_data* last = last_bss != NULL ? last_bss : last_data;
   this->memsz_ = (last->address()
                  + last->data_size()
                  - this->vaddr_);
@@ -4087,6 +4083,37 @@ Output_segment::set_offset(unsigned int increase)
     }
 }
 
+// Look through a list of Output_data objects and find the first and
+// last by address.
+
+void
+Output_segment::find_first_and_last_list(const Output_data_list* pdl,
+                                        const Output_data** pfirst,
+                                        const Output_data** plast) const
+{
+  const Output_data* first = *pfirst;
+  const Output_data* last = *plast;
+  for (Output_data_list::const_iterator p = pdl->begin(); p != pdl->end(); ++p)
+    {
+      if (first == NULL
+         || (*p)->address() < first->address()
+         || ((*p)->address() == first->address()
+             && (*p)->data_size() < first->data_size()))
+       {
+         first = *p;
+         *pfirst = first;
+       }
+      if (last == NULL
+         || (*p)->address() > last->address()
+         || ((*p)->address() == last->address()
+             && (*p)->data_size() > last->data_size()))
+       {
+         last = *p;
+         *plast = last;
+       }
+    }
+}
+
 // Set the TLS offsets of the sections in the PT_TLS segment.
 
 void
index 894773d19c5d6f3d18092514246697b3253f51bb..b07c4ad36e9a8b4e5f8992a311de3edb9a5406cf 100644 (file)
@@ -4023,6 +4023,12 @@ class Output_segment
                              Output_section** found,
                              uint64_t* found_lma) const;
 
+  // Find the first and last entries by address.
+  void
+  find_first_and_last_list(const Output_data_list* pdl,
+                          const Output_data** pfirst,
+                          const Output_data** plast) const;
+
   // Write the section headers in the list into V.
   template<int size, bool big_endian>
   unsigned char*
index 5f67e3f6f0651c41d45b23e8bac33c2a70607c33..c1eddcdb14433595c9cb3d2484ffb136c641ace7 100644 (file)
@@ -1078,6 +1078,14 @@ relro_test.so: gcctestdir/ld relro_test_pic.o
 relro_test_pic.o: relro_test.cc
        $(CXXCOMPILE) -c -fpic -o $@ $<
 
+check_PROGRAMS += relro_strip_test
+relro_strip_test_SOURCES = relro_test_main.cc
+relro_strip_test_DEPENDENCIES = gcctestdir/ld relro_strip_test.so
+relro_strip_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,.
+relro_strip_test_LDADD = relro_strip_test.so
+relro_strip_test.so: relro_test.so
+       $(TEST_STRIP) -o $@ $<
+
 check_PROGRAMS += relro_script_test
 relro_script_test_SOURCES = relro_test_main.cc
 relro_script_test_DEPENDENCIES = gcctestdir/ld relro_script_test.so
index c4215bc879e7ca93efdb168eee0352bbe1002970..f2552e31c32613a3e6a23accc991b72e9c85fc1e 100644 (file)
@@ -236,6 +236,7 @@ check_PROGRAMS = object_unittest$(EXEEXT) binary_unittest$(EXEEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_6 ver_test_8 ver_test_9 \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ ver_test_11 protected_1 \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ protected_2 relro_test \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ relro_strip_test \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ relro_script_test script_test_1 \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_2 justsyms \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ binary_test script_test_3 \
@@ -496,6 +497,7 @@ libgoldtest_a_OBJECTS = $(am_libgoldtest_a_OBJECTS)
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ protected_1$(EXEEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ protected_2$(EXEEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ relro_test$(EXEEXT) \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ relro_strip_test$(EXEEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ relro_script_test$(EXEEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_1$(EXEEXT) \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ script_test_2$(EXEEXT) \
@@ -795,6 +797,11 @@ protected_2_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
 relro_script_test_OBJECTS = $(am_relro_script_test_OBJECTS)
 relro_script_test_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
        $(relro_script_test_LDFLAGS) $(LDFLAGS) -o $@
+@GCC_TRUE@@NATIVE_LINKER_TRUE@am_relro_strip_test_OBJECTS =  \
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ relro_test_main.$(OBJEXT)
+relro_strip_test_OBJECTS = $(am_relro_strip_test_OBJECTS)
+relro_strip_test_LINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) \
+       $(relro_strip_test_LDFLAGS) $(LDFLAGS) -o $@
 @GCC_TRUE@@NATIVE_LINKER_TRUE@am_relro_test_OBJECTS =  \
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ relro_test_main.$(OBJEXT)
 relro_test_OBJECTS = $(am_relro_test_OBJECTS)
@@ -1141,10 +1148,11 @@ SOURCES = $(libgoldtest_a_SOURCES) basic_pic_test.c basic_pie_test.c \
        plugin_test_2.c plugin_test_3.c plugin_test_4.c \
        plugin_test_5.c plugin_test_6.c plugin_test_7.c \
        plugin_test_8.c $(protected_1_SOURCES) $(protected_2_SOURCES) \
-       $(relro_script_test_SOURCES) $(relro_test_SOURCES) \
-       $(script_test_1_SOURCES) $(script_test_2_SOURCES) \
-       script_test_3.c $(searched_file_test_SOURCES) \
-       $(thin_archive_test_1_SOURCES) $(thin_archive_test_2_SOURCES) \
+       $(relro_script_test_SOURCES) $(relro_strip_test_SOURCES) \
+       $(relro_test_SOURCES) $(script_test_1_SOURCES) \
+       $(script_test_2_SOURCES) script_test_3.c \
+       $(searched_file_test_SOURCES) $(thin_archive_test_1_SOURCES) \
+       $(thin_archive_test_2_SOURCES) \
        $(tls_phdrs_script_test_SOURCES) $(tls_pic_test_SOURCES) \
        tls_pie_pic_test.c tls_pie_test.c $(tls_script_test_SOURCES) \
        $(tls_shared_gd_to_ie_test_SOURCES) \
@@ -1739,6 +1747,10 @@ binary_unittest_SOURCES = binary_unittest.cc
 @GCC_TRUE@@NATIVE_LINKER_TRUE@relro_test_DEPENDENCIES = gcctestdir/ld relro_test.so
 @GCC_TRUE@@NATIVE_LINKER_TRUE@relro_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,.
 @GCC_TRUE@@NATIVE_LINKER_TRUE@relro_test_LDADD = relro_test.so
+@GCC_TRUE@@NATIVE_LINKER_TRUE@relro_strip_test_SOURCES = relro_test_main.cc
+@GCC_TRUE@@NATIVE_LINKER_TRUE@relro_strip_test_DEPENDENCIES = gcctestdir/ld relro_strip_test.so
+@GCC_TRUE@@NATIVE_LINKER_TRUE@relro_strip_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,.
+@GCC_TRUE@@NATIVE_LINKER_TRUE@relro_strip_test_LDADD = relro_strip_test.so
 @GCC_TRUE@@NATIVE_LINKER_TRUE@relro_script_test_SOURCES = relro_test_main.cc
 @GCC_TRUE@@NATIVE_LINKER_TRUE@relro_script_test_DEPENDENCIES = gcctestdir/ld relro_script_test.so
 @GCC_TRUE@@NATIVE_LINKER_TRUE@relro_script_test_LDFLAGS = -Bgcctestdir/ -Wl,-R,.
@@ -2066,6 +2078,9 @@ protected_2$(EXEEXT): $(protected_2_OBJECTS) $(protected_2_DEPENDENCIES)
 relro_script_test$(EXEEXT): $(relro_script_test_OBJECTS) $(relro_script_test_DEPENDENCIES) 
        @rm -f relro_script_test$(EXEEXT)
        $(relro_script_test_LINK) $(relro_script_test_OBJECTS) $(relro_script_test_LDADD) $(LIBS)
+relro_strip_test$(EXEEXT): $(relro_strip_test_OBJECTS) $(relro_strip_test_DEPENDENCIES) 
+       @rm -f relro_strip_test$(EXEEXT)
+       $(relro_strip_test_LINK) $(relro_strip_test_OBJECTS) $(relro_strip_test_LDADD) $(LIBS)
 relro_test$(EXEEXT): $(relro_test_OBJECTS) $(relro_test_DEPENDENCIES) 
        @rm -f relro_test$(EXEEXT)
        $(relro_test_LINK) $(relro_test_OBJECTS) $(relro_test_LDADD) $(LIBS)
@@ -2812,6 +2827,8 @@ protected_2.log: protected_2$(EXEEXT)
        @p='protected_2$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
 relro_test.log: relro_test$(EXEEXT)
        @p='relro_test$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
+relro_strip_test.log: relro_strip_test$(EXEEXT)
+       @p='relro_strip_test$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
 relro_script_test.log: relro_script_test$(EXEEXT)
        @p='relro_script_test$(EXEEXT)'; $(am__check_pre) $(LOG_COMPILE) "$$tst" $(am__check_post)
 script_test_1.log: script_test_1$(EXEEXT)
@@ -3428,6 +3445,8 @@ uninstall-am:
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared -Wl,-z,relro relro_test_pic.o
 @GCC_TRUE@@NATIVE_LINKER_TRUE@relro_test_pic.o: relro_test.cc
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXCOMPILE) -c -fpic -o $@ $<
+@GCC_TRUE@@NATIVE_LINKER_TRUE@relro_strip_test.so: relro_test.so
+@GCC_TRUE@@NATIVE_LINKER_TRUE@ $(TEST_STRIP) -o $@ $<
 @GCC_TRUE@@NATIVE_LINKER_TRUE@relro_script_test.so: gcctestdir/ld relro_script_test.t relro_test_pic.o
 @GCC_TRUE@@NATIVE_LINKER_TRUE@ $(CXXLINK) -Bgcctestdir/ -shared -Wl,-z,relro -T $(srcdir)/relro_script_test.t relro_test_pic.o
 @GCC_TRUE@@NATIVE_LINKER_TRUE@justsyms_2.o: justsyms_2.cc