aboutsummaryrefslogtreecommitdiff
path: root/gold
diff options
context:
space:
mode:
authorCary Coutant <ccoutant@gmail.com>2017-01-10 07:46:30 -0800
committerCary Coutant <ccoutant@gmail.com>2017-01-10 07:46:43 -0800
commit98461510d3a8cefa6603980294bfc647cddcab97 (patch)
treedc33202fc8f637c12ed4c36fd8fceca3548e5915 /gold
parentdf2946549f60624503663cc6c28cd5a6ef0ab434 (diff)
downloadfsf-binutils-gdb-98461510d3a8cefa6603980294bfc647cddcab97.zip
fsf-binutils-gdb-98461510d3a8cefa6603980294bfc647cddcab97.tar.gz
fsf-binutils-gdb-98461510d3a8cefa6603980294bfc647cddcab97.tar.bz2
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.
Diffstat (limited to 'gold')
-rw-r--r--gold/ChangeLog10
-rw-r--r--gold/aarch64.cc6
-rw-r--r--gold/arm.cc6
-rw-r--r--gold/object.h7
-rw-r--r--gold/reloc.cc73
5 files changed, 93 insertions, 9 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 3f1a2fc..10c21b6 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,13 @@
+2017-01-10 Cary Coutant <ccoutant@gmail.com>
+
+ * 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 <amodra@gmail.com>
* testsuite/ver_test_8.sh: Accept .TOC. in lieu of
diff --git a/gold/aarch64.cc b/gold/aarch64.cc
index facbbd8..b207dcd 100644
--- a/gold/aarch64.cc
+++ b/gold/aarch64.cc
@@ -2044,9 +2044,9 @@ AArch64_relobj<size, big_endian>::do_relocate_sections(
const unsigned char* pshdrs, Output_file* of,
typename Sized_relobj_file<size, big_endian>::Views* pviews)
{
- // Call parent to relocate sections.
- Sized_relobj_file<size, 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/arm.cc b/gold/arm.cc
index 5983128..ff472ea 100644
--- a/gold/arm.cc
+++ b/gold/arm.cc
@@ -6587,9 +6587,9 @@ Arm_relobj<big_endian>::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 84fe5a6..508e79c 100644
--- a/gold/object.h
+++ b/gold/object.h
@@ -2562,6 +2562,13 @@ class Sized_relobj_file : public Sized_relobj<size, big_endian>
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 bc5bc8b..26d84d0 100644
--- a/gold/reloc.cc
+++ b/gold/reloc.cc
@@ -871,7 +871,30 @@ Sized_relobj_file<size, big_endian>::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<int size, bool big_endian>
+void
+Sized_relobj_file<size, big_endian>::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<size, big_endian>* target =
parameters->sized_target<size, big_endian>();
@@ -883,8 +906,8 @@ Sized_relobj_file<size, big_endian>::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);
@@ -1718,6 +1741,17 @@ Sized_relobj_file<32, false>::do_relocate_sections(
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(
unsigned int shndx,
@@ -1735,6 +1769,17 @@ Sized_relobj_file<32, true>::do_relocate_sections(
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(
unsigned int shndx,
@@ -1752,6 +1797,17 @@ Sized_relobj_file<64, false>::do_relocate_sections(
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(
unsigned int shndx,
@@ -1769,6 +1825,17 @@ Sized_relobj_file<64, true>::do_relocate_sections(
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(
unsigned int shndx,