From: Cary Coutant Date: Tue, 10 Jan 2017 15:46:30 +0000 (-0800) Subject: Refactor Sized_relobj_file::do_relocate_sections. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d9783d7436b787977e35f5556f3a13470e84cbd4;p=thirdparty%2Fbinutils-gdb.git Refactor Sized_relobj_file::do_relocate_sections. gold/ * aarch64.cc (AArch64_relobj::do_relocate_sections): Call Sized_relobj_file::relocate_section_range(). * arm.cc (Arm_relobj::do_relocate_sections): Likewise. * object.h (Sized_relobj_file::relocate_section_range): New method. * reloc.cc (Sized_relobj_file::do_relocate_sections): Move implementation... (Sized_relobj_file::relocate_section_range): ...to new method. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 87908111565..81d7ca12e3d 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,6 +1,15 @@ 2017-02-22 Alan Modra Apply from master + 2017-01-10 Cary Coutant + * aarch64.cc (AArch64_relobj::do_relocate_sections): Call + Sized_relobj_file::relocate_section_range(). + * arm.cc (Arm_relobj::do_relocate_sections): Likewise. + * object.h (Sized_relobj_file::relocate_section_range): New method. + * reloc.cc (Sized_relobj_file::do_relocate_sections): Move + implementation... + (Sized_relobj_file::relocate_section_range): ...to new method. + 2017-01-10 Alan Modra * options.h: Add --secure-plt option. * powerpc.cc (Target_powerpc::Scan::local): Detect and error diff --git a/gold/aarch64.cc b/gold/aarch64.cc index f31e0918d73..96ed66e3ef7 100644 --- a/gold/aarch64.cc +++ b/gold/aarch64.cc @@ -2044,9 +2044,9 @@ AArch64_relobj::do_relocate_sections( const unsigned char* pshdrs, Output_file* of, typename Sized_relobj_file::Views* pviews) { - // Call parent to relocate sections. - Sized_relobj_file::do_relocate_sections(symtab, layout, - pshdrs, of, pviews); + // Relocate the section data. + this->relocate_section_range(symtab, layout, pshdrs, of, pviews, + 1, this->shnum() - 1); // We do not generate stubs if doing a relocatable link. if (parameters->options().relocatable()) diff --git a/gold/arm.cc b/gold/arm.cc index 9120279f83f..d9c0a2b20de 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -6555,9 +6555,9 @@ Arm_relobj::do_relocate_sections( Output_file* of, typename Sized_relobj_file<32, big_endian>::Views* pviews) { - // Call parent to relocate sections. - Sized_relobj_file<32, big_endian>::do_relocate_sections(symtab, layout, - pshdrs, of, pviews); + // Relocate the section data. + this->relocate_section_range(symtab, layout, pshdrs, of, pviews, + 1, this->shnum() - 1); // We do not generate stubs if doing a relocatable link. if (parameters->options().relocatable()) diff --git a/gold/object.h b/gold/object.h index 95f6d56e086..aa1a815f031 100644 --- a/gold/object.h +++ b/gold/object.h @@ -2562,6 +2562,13 @@ class Sized_relobj_file : public Sized_relobj const unsigned char* pshdrs, Output_file* of, Views* pviews); + // Relocate section data for a range of sections. + void + relocate_section_range(const Symbol_table* symtab, const Layout* layout, + const unsigned char* pshdrs, Output_file* of, + Views* pviews, unsigned int start_shndx, + unsigned int end_shndx); + // Adjust this local symbol value. Return false if the symbol // should be discarded from the output file. virtual bool diff --git a/gold/reloc.cc b/gold/reloc.cc index ca54f153a3f..8bbb07d3960 100644 --- a/gold/reloc.cc +++ b/gold/reloc.cc @@ -871,7 +871,30 @@ Sized_relobj_file::do_relocate_sections( Output_file* of, Views* pviews) { - unsigned int shnum = this->shnum(); + this->relocate_section_range(symtab, layout, pshdrs, of, pviews, + 1, this->shnum() - 1); +} + +// Relocate section data for the range of sections START_SHNDX through +// END_SHNDX. + +template +void +Sized_relobj_file::relocate_section_range( + const Symbol_table* symtab, + const Layout* layout, + const unsigned char* pshdrs, + Output_file* of, + Views* pviews, + unsigned int start_shndx, + unsigned int end_shndx) +{ + gold_assert(start_shndx >= 1); + gold_assert(end_shndx < this->shnum()); + + if (end_shndx < start_shndx) + return; + Sized_target* target = parameters->sized_target(); @@ -883,8 +906,8 @@ Sized_relobj_file::do_relocate_sections( relinfo.layout = layout; relinfo.object = this; - const unsigned char* p = pshdrs + This::shdr_size; - for (unsigned int i = 1; i < shnum; ++i, p += This::shdr_size) + const unsigned char* p = pshdrs + start_shndx * This::shdr_size; + for (unsigned int i = start_shndx; i <= end_shndx; ++i, p += This::shdr_size) { typename This::Shdr shdr(p); @@ -1717,6 +1740,17 @@ Sized_relobj_file<32, false>::do_relocate_sections( Output_file* of, Views* pviews); +template +void +Sized_relobj_file<32, false>::relocate_section_range( + const Symbol_table* symtab, + const Layout* layout, + const unsigned char* pshdrs, + Output_file* of, + Views* pviews, + unsigned int start_shndx, + unsigned int end_shndx); + template unsigned char* Sized_relobj_file<32, false>::do_get_output_view( @@ -1734,6 +1768,17 @@ Sized_relobj_file<32, true>::do_relocate_sections( Output_file* of, Views* pviews); +template +void +Sized_relobj_file<32, true>::relocate_section_range( + const Symbol_table* symtab, + const Layout* layout, + const unsigned char* pshdrs, + Output_file* of, + Views* pviews, + unsigned int start_shndx, + unsigned int end_shndx); + template unsigned char* Sized_relobj_file<32, true>::do_get_output_view( @@ -1751,6 +1796,17 @@ Sized_relobj_file<64, false>::do_relocate_sections( Output_file* of, Views* pviews); +template +void +Sized_relobj_file<64, false>::relocate_section_range( + const Symbol_table* symtab, + const Layout* layout, + const unsigned char* pshdrs, + Output_file* of, + Views* pviews, + unsigned int start_shndx, + unsigned int end_shndx); + template unsigned char* Sized_relobj_file<64, false>::do_get_output_view( @@ -1768,6 +1824,17 @@ Sized_relobj_file<64, true>::do_relocate_sections( Output_file* of, Views* pviews); +template +void +Sized_relobj_file<64, true>::relocate_section_range( + const Symbol_table* symtab, + const Layout* layout, + const unsigned char* pshdrs, + Output_file* of, + Views* pviews, + unsigned int start_shndx, + unsigned int end_shndx); + template unsigned char* Sized_relobj_file<64, true>::do_get_output_view(