2009-12-03 Doug Kwan <dougkwan@google.com>
authorDoug Kwan <dougkwan@google.com>
Thu, 3 Dec 2009 23:13:55 +0000 (23:13 +0000)
committerDoug Kwan <dougkwan@google.com>
Thu, 3 Dec 2009 23:13:55 +0000 (23:13 +0000)
* arm.cc: Remove comment about missing .ARM.exidx section symbols.
(Target_arm::do_finalize_sections): Add parameter for symbol table
pointer.  Add __exidx_start and __exidx_end symbols as appropriate.
* i386.cc (Target_i386::do_finalize_sections): Add an additional
parameter for symbol table pointer.
* layout.cc (Layout::finalize): Call Target::finalize_sections with
an additional parameter for a pointer to symbol table.
* powerpc.cc (Target_powerpc::do_finalize_sections): Add an additional
parameter for a symbol table pointer.
* sparc.cc (Target_sparc::do_finalize_sections): Ditto.
* target.h (Target::finalize_sections, Target::do_finalize_sections):
Ditto.
* x86_64.cc (Target_x86_64::do_finalize_sections): Add an additional
parameter for a symbol table pointer.

gold/ChangeLog
gold/arm.cc
gold/i386.cc
gold/layout.cc
gold/powerpc.cc
gold/sparc.cc
gold/target.h
gold/x86_64.cc

index 8a25752514a97695005b76ef7c2307fe58b4433e..d8a652a80bb9d42de080b989b779e5aedc1cfc72 100644 (file)
@@ -1,3 +1,20 @@
+2009-12-03  Doug Kwan  <dougkwan@google.com>
+
+       * arm.cc: Remove comment about missing .ARM.exidx section symbols.
+       (Target_arm::do_finalize_sections): Add parameter for symbol table
+       pointer.  Add __exidx_start and __exidx_end symbols as appropriate.
+       * i386.cc (Target_i386::do_finalize_sections): Add an additional
+       parameter for symbol table pointer.
+       * layout.cc (Layout::finalize): Call Target::finalize_sections with
+       an additional parameter for a pointer to symbol table.
+       * powerpc.cc (Target_powerpc::do_finalize_sections): Add an additional
+       parameter for a symbol table pointer.
+       * sparc.cc (Target_sparc::do_finalize_sections): Ditto.
+       * target.h (Target::finalize_sections, Target::do_finalize_sections):
+       Ditto.
+       * x86_64.cc (Target_x86_64::do_finalize_sections): Add an additional
+       parameter for a symbol table pointer.
+
 2009-12-03  Rafael Avila de Espindola  <espindola@google.com>
 
        * incremental.cc (Incremental_inputs_header)
index 3ea98de853c35a5eee1ba9b9987bd03a5bfd157d..d8c58ea5d16d9483be999482b7e1aa3aea098ac1 100644 (file)
@@ -123,7 +123,6 @@ const int32_t THM2_MAX_BWD_BRANCH_OFFSET = (-(1 << 24) + 4);
 // TODOs:
 // - Generate various branch stubs.
 // - Support interworking.
-// - Define section symbols __exidx_start and __exidx_stop.
 // - Support more relocation types as needed. 
 // - Make PLTs more flexible for different architecture features like
 //   Thumb-2 and BE8.
@@ -1234,7 +1233,7 @@ class Target_arm : public Sized_target<32, big_endian>
 
   // Finalize the sections.
   void
-  do_finalize_sections(Layout*, const Input_objects*);
+  do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
 
   // Return the value to use for a dynamic symbol which requires special
   // treatment.
@@ -4560,7 +4559,8 @@ template<bool big_endian>
 void
 Target_arm<big_endian>::do_finalize_sections(
     Layout* layout,
-    const Input_objects* input_objects)
+    const Input_objects* input_objects,
+    Symbol_table* symtab)
 {
   // Merge processor-specific flags.
   for (Input_objects::Relobj_iterator p = input_objects->relobj_begin();
@@ -4625,16 +4625,25 @@ Target_arm<big_endian>::do_finalize_sections(
   if (this->copy_relocs_.any_saved_relocs())
     this->copy_relocs_.emit(this->rel_dyn_section(layout));
 
-  // For the ARM target, we need to add a PT_ARM_EXIDX segment for
-  // the .ARM.exidx section.
-  if (!layout->script_options()->saw_phdrs_clause()
+  // Handle the .ARM.exidx section.
+  Output_section* exidx_section = layout->find_output_section(".ARM.exidx");
+  if (exidx_section != NULL
+      && exidx_section->type() == elfcpp::SHT_ARM_EXIDX
       && !parameters->options().relocatable())
     {
-      Output_section* exidx_section =
-       layout->find_output_section(".ARM.exidx");
+      // Create __exidx_start and __exdix_end symbols.
+      symtab->define_in_output_data("__exidx_start", NULL, exidx_section,
+                                   0, 0, elfcpp::STT_OBJECT,
+                                   elfcpp::STB_LOCAL, elfcpp::STV_HIDDEN, 0,
+                                   false, false);
+      symtab->define_in_output_data("__exidx_end", NULL, exidx_section,
+                                   0, 0, elfcpp::STT_OBJECT,
+                                   elfcpp::STB_LOCAL, elfcpp::STV_HIDDEN, 0,
+                                   true, false);
 
-      if (exidx_section != NULL
-         && exidx_section->type() == elfcpp::SHT_ARM_EXIDX)
+      // For the ARM target, we need to add a PT_ARM_EXIDX segment for
+      // the .ARM.exidx section.
+      if (!layout->script_options()->saw_phdrs_clause())
        {
          gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0, 0)
                      == NULL);
index 3e0ddcb034125dd516dfd07ac5612866ce4f9f81..eabf8e0724f1ea1f6c1b4889f4554070822ee9f1 100644 (file)
@@ -95,7 +95,7 @@ class Target_i386 : public Target_freebsd<32, false>
 
   // Finalize the sections.
   void
-  do_finalize_sections(Layout*, const Input_objects*);
+  do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
 
   // Return the value to use for a dynamic which requires special
   // treatment.
@@ -1552,7 +1552,10 @@ Target_i386::scan_relocs(Symbol_table* symtab,
 // Finalize the sections.
 
 void
-Target_i386::do_finalize_sections(Layout* layout, const Input_objects*)
+Target_i386::do_finalize_sections(
+    Layout* layout,
+    const Input_objects*,
+    Symbol_table*)
 {
   // Fill in some more dynamic tags.
   Output_data_dynamic* const odyn = layout->dynamic_data();
index b44dba65796af2de568426b890002e111f9d30b5..a7f8185d49acb6201efb05eb59373905d64f7d83 100644 (file)
@@ -1533,7 +1533,7 @@ off_t
 Layout::finalize(const Input_objects* input_objects, Symbol_table* symtab,
                 Target* target, const Task* task)
 {
-  target->finalize_sections(this, input_objects);
+  target->finalize_sections(this, input_objects, symtab);
 
   this->count_local_symbols(task, input_objects);
 
index 8fe8877300bf7687ac3d33f748fe506b5c5cb201..36b5790d3035a447a9c58c46eedc437a849bb509 100644 (file)
@@ -92,7 +92,7 @@ class Target_powerpc : public Sized_target<size, big_endian>
              const unsigned char* plocal_symbols);
   // Finalize the sections.
   void
-  do_finalize_sections(Layout*, const Input_objects*);
+  do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
 
   // Return the value to use for a dynamic which requires special
   // treatment.
@@ -1532,7 +1532,8 @@ template<int size, bool big_endian>
 void
 Target_powerpc<size, big_endian>::do_finalize_sections(
     Layout* layout,
-    const Input_objects*)
+    const Input_objects*,
+    Symbol_table*)
 {
   // Fill in some more dynamic tags.
   Output_data_dynamic* const odyn = layout->dynamic_data();
index d344af230916bb46fddb27eace0cb88353867ccc..acf5ba617431ea3922ef56153bb9cabc31079273 100644 (file)
@@ -94,7 +94,7 @@ class Target_sparc : public Sized_target<size, big_endian>
              const unsigned char* plocal_symbols);
   // Finalize the sections.
   void
-  do_finalize_sections(Layout*, const Input_objects*);
+  do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
 
   // Return the value to use for a dynamic which requires special
   // treatment.
@@ -2319,7 +2319,8 @@ template<int size, bool big_endian>
 void
 Target_sparc<size, big_endian>::do_finalize_sections(
     Layout* layout,
-    const Input_objects*)
+    const Input_objects*,
+    Symbol_table*)
 {
   // Fill in some more dynamic tags.
   Output_data_dynamic* const odyn = layout->dynamic_data();
index e301b0b3385b974d7330ff739e93aca06ce7e987..729b4c796d7ca9d514c1788605a1d2e91ec49341 100644 (file)
@@ -194,8 +194,9 @@ class Target
   // This is called to tell the target to complete any sections it is
   // handling.  After this all sections must have their final size.
   void
-  finalize_sections(Layout* layout, const Input_objects* input_objects)
-  { return this->do_finalize_sections(layout, input_objects); }
+  finalize_sections(Layout* layout, const Input_objects* input_objects,
+                   Symbol_table* symtab)
+  { return this->do_finalize_sections(layout, input_objects, symtab); }
 
   // Return the value to use for a global symbol which needs a special
   // value in the dynamic symbol table.  This will only be called if
@@ -336,7 +337,7 @@ class Target
 
   // Virtual function which may be implemented by the child class.
   virtual void
-  do_finalize_sections(Layout*, const Input_objects*)
+  do_finalize_sections(Layout*, const Input_objects*, Symbol_table*)
   { }
 
   // Virtual function which may be implemented by the child class.
index 5526f6fe089e9216e953f2408a6256252581059b..2972180d213277c49ff01be849d77de958daabc5 100644 (file)
@@ -102,7 +102,7 @@ class Target_x86_64 : public Target_freebsd<64, false>
 
   // Finalize the sections.
   void
-  do_finalize_sections(Layout*, const Input_objects*);
+  do_finalize_sections(Layout*, const Input_objects*, Symbol_table*);
 
   // Return the value to use for a dynamic which requires special
   // treatment.
@@ -1642,7 +1642,10 @@ Target_x86_64::scan_relocs(Symbol_table* symtab,
 // Finalize the sections.
 
 void
-Target_x86_64::do_finalize_sections(Layout* layout, const Input_objects*)
+Target_x86_64::do_finalize_sections(
+    Layout* layout,
+    const Input_objects*,
+    Symbol_table*)
 {
   // Fill in some more dynamic tags.
   Output_data_dynamic* const odyn = layout->dynamic_data();