From: Doug Kwan Date: Tue, 11 Aug 2009 17:09:14 +0000 (+0000) Subject: 2009-08-11 Doug Kwan X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=11af873fca0a3bc4c3476e35ec931a49dce101ee;p=binutils-gdb.git 2009-08-11 Doug Kwan * arm.cc: Update comments. (Target_arm::do_finalize_sections): Add a special PT_ARM_EXIDX segment to locate the .ARM.exidx section if present. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index b71bc6cb094..754938264c6 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,9 @@ +2009-08-11 Doug Kwan + + * 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-08-09 Doug Kwan * dynobj.h (Sized_dynobj::do_section_entsize): Revert the previous diff --git a/gold/arm.cc b/gold/arm.cc index 491f254d104..0e4a3ebecdf 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -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::do_finalize_sections(Layout* layout) // 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.