From f59f41f3e62c417ef569b65a01cc2e657ec9a94f Mon Sep 17 00:00:00 2001 From: Doug Kwan Date: Thu, 3 Dec 2009 23:13:55 +0000 Subject: [PATCH] 2009-12-03 Doug Kwan * 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 | 17 +++++++++++++++++ gold/arm.cc | 29 +++++++++++++++++++---------- gold/i386.cc | 7 +++++-- gold/layout.cc | 2 +- gold/powerpc.cc | 5 +++-- gold/sparc.cc | 5 +++-- gold/target.h | 7 ++++--- gold/x86_64.cc | 7 +++++-- 8 files changed, 57 insertions(+), 22 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index 8a25752514a..d8a652a80bb 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,20 @@ +2009-12-03 Doug Kwan + + * 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 * incremental.cc (Incremental_inputs_header) diff --git a/gold/arm.cc b/gold/arm.cc index 3ea98de853c..d8c58ea5d16 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -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 void Target_arm::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::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); diff --git a/gold/i386.cc b/gold/i386.cc index 3e0ddcb0341..eabf8e0724f 100644 --- a/gold/i386.cc +++ b/gold/i386.cc @@ -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(); diff --git a/gold/layout.cc b/gold/layout.cc index b44dba65796..a7f8185d49a 100644 --- a/gold/layout.cc +++ b/gold/layout.cc @@ -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); diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 8fe8877300b..36b5790d303 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -92,7 +92,7 @@ class Target_powerpc : public Sized_target 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 void Target_powerpc::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(); diff --git a/gold/sparc.cc b/gold/sparc.cc index d344af23091..acf5ba61743 100644 --- a/gold/sparc.cc +++ b/gold/sparc.cc @@ -94,7 +94,7 @@ class Target_sparc : public Sized_target 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 void Target_sparc::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(); diff --git a/gold/target.h b/gold/target.h index e301b0b3385..729b4c796d7 100644 --- a/gold/target.h +++ b/gold/target.h @@ -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. diff --git a/gold/x86_64.cc b/gold/x86_64.cc index 5526f6fe089..2972180d213 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -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();