[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