aboutsummaryrefslogtreecommitdiff
path: root/gold/reloc.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gold/reloc.cc')
-rw-r--r--gold/reloc.cc57
1 files changed, 57 insertions, 0 deletions
diff --git a/gold/reloc.cc b/gold/reloc.cc
index f18f432..b83a962 100644
--- a/gold/reloc.cc
+++ b/gold/reloc.cc
@@ -665,6 +665,24 @@ Sized_relobj_file<size, big_endian>::do_relocate(const Symbol_table* symtab,
// input offsets to output addresses.
this->initialize_input_to_output_maps();
+ // Make the views available through get_output_view() for the duration
+ // of this routine. This RAII class will reset output_views_ to NULL
+ // when the views go out of scope.
+ struct Set_output_views
+ {
+ Set_output_views(const Views** ppviews, const Views* pviews)
+ {
+ ppviews_ = ppviews;
+ *ppviews = pviews;
+ }
+
+ ~Set_output_views()
+ { *ppviews_ = NULL; }
+
+ const Views** ppviews_;
+ };
+ Set_output_views set_output_views(&this->output_views_, &views);
+
// Apply relocations.
this->relocate_sections(symtab, layout, pshdrs, of, &views);
@@ -1040,6 +1058,21 @@ Sized_relobj_file<size, big_endian>::do_relocate_sections(
}
}
+// Return the output view for section SHNDX.
+
+template<int size, bool big_endian>
+const unsigned char*
+Sized_relobj_file<size, big_endian>::do_get_output_view(
+ unsigned int shndx,
+ section_size_type* plen) const
+{
+ gold_assert(this->output_views_ != NULL);
+ gold_assert(shndx < this->output_views_->size());
+ const View_size& v = (*this->output_views_)[shndx];
+ *plen = v.view_size;
+ return v.view;
+}
+
// Write the incremental relocs.
template<int size, bool big_endian>
@@ -1739,6 +1772,12 @@ Sized_relobj_file<32, false>::do_relocate_sections(
const unsigned char* pshdrs,
Output_file* of,
Views* pviews);
+
+template
+const unsigned char*
+Sized_relobj_file<32, false>::do_get_output_view(
+ unsigned int shndx,
+ section_size_type* plen) const;
#endif
#ifdef HAVE_TARGET_32_BIG
@@ -1750,6 +1789,12 @@ Sized_relobj_file<32, true>::do_relocate_sections(
const unsigned char* pshdrs,
Output_file* of,
Views* pviews);
+
+template
+const unsigned char*
+Sized_relobj_file<32, true>::do_get_output_view(
+ unsigned int shndx,
+ section_size_type* plen) const;
#endif
#ifdef HAVE_TARGET_64_LITTLE
@@ -1761,6 +1806,12 @@ Sized_relobj_file<64, false>::do_relocate_sections(
const unsigned char* pshdrs,
Output_file* of,
Views* pviews);
+
+template
+const unsigned char*
+Sized_relobj_file<64, false>::do_get_output_view(
+ unsigned int shndx,
+ section_size_type* plen) const;
#endif
#ifdef HAVE_TARGET_64_BIG
@@ -1772,6 +1823,12 @@ Sized_relobj_file<64, true>::do_relocate_sections(
const unsigned char* pshdrs,
Output_file* of,
Views* pviews);
+
+template
+const unsigned char*
+Sized_relobj_file<64, true>::do_get_output_view(
+ unsigned int shndx,
+ section_size_type* plen) const;
#endif
#ifdef HAVE_TARGET_32_LITTLE