[PATCH][GOLD] Add a PT_ARM_EXIDX segment for the .ARM.exidx section.

Doug Kwan (關振德) dougkwan@google.com
Mon Aug 10 23:07:00 GMT 2009


I have updated the patch as suggested.

2009-08-10  Doug Kwan  <dougkwan@google.com>

        * arm.cc: Update comments.
        (Target_arm::do_finalize_sections): Add a special PT_ARM_EXIDX
        segment to locate the .ARM.exidx section if present.


2009/8/10 Ian Lance Taylor <iant@google.com>:
> "Doug Kwan (關振德)" <dougkwan@google.com> writes:
>
>>     This patch add a PT_ARM_EXIDX segment in the program header when
>> there is a .ARM.exidx of type SHT_ARM_EXIDX unless we want relocatable
>> linking or any PHDRS clauses are present in a script.    This is done
>> in layout.cc mainly for simplity.  I am more than happy to move this
>> to arm.cc and define a target hook if there is a better approach.
>
> I think it would work to do this in
> Target_arm<big_endian>::do_finalize_sections.
>
>> +       gold_assert(!find_output_segment(elfcpp::PT_ARM_EXIDX, 0, 0));
>
> Note that find_output_segment does not return a bool, so this should be
>    layout->find_output_segment(...) != NULL
>
> Ian
>
-------------- next part --------------
Index: gold/arm.cc
===================================================================
RCS file: /cvs/src/src/gold/arm.cc,v
retrieving revision 1.7
diff -u -p -r1.7 arm.cc
--- gold/arm.cc	22 Jun 2009 06:51:53 -0000	1.7
+++ gold/arm.cc	10 Aug 2009 22:42:26 -0000
@@ -74,18 +74,14 @@ class Output_data_plt_arm;
 // R_ARM_TARGET1
 // R_ARM_PREL31
 // 
-// Coming soon (pending patches):
-// - Defining section symbols __exidx_start and __exidx_stop.
-// - Support interworking.
-// - Mergeing all .ARM.xxx.yyy sections into .ARM.xxx.  Currently, they
-//   are incorrectly merged into an .ARM section.
-//
 // TODOs:
-// - Create a PT_ARM_EXIDX program header for a shared object that
-//   might throw an exception.
+// - 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.
+// There are probably a lot more.
 
 // Utilities for manipulating integers of up to 32-bits
 
@@ -1463,6 +1459,25 @@ Target_arm<big_endian>::do_finalize_sect
   // relocs.
   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()
+      && !parameters->options().relocatable())
+    {
+      Output_section* exidx_section =
+	layout->find_output_section(".ARM.exidx");
+
+      if (exidx_section != NULL
+	  && exidx_section->type() == elfcpp::SHT_ARM_EXIDX)
+	{
+	  gold_assert(layout->find_output_segment(elfcpp::PT_ARM_EXIDX, 0, 0)
+		      == NULL);
+	  Output_segment*  exidx_segment =
+	    layout->make_output_segment(elfcpp::PT_ARM_EXIDX, elfcpp::PF_R);
+	  exidx_segment->add_output_section(exidx_section, elfcpp::PF_R);
+	}
+    }
 }
 
 // Return whether a direct absolute static relocation needs to be applied.


More information about the Binutils mailing list