summaryrefslogtreecommitdiff
path: root/gold/layout.h
diff options
context:
space:
mode:
authorSriraman Tallam <tmsriram@google.com>2012-08-24 18:35:35 +0000
committerSriraman Tallam <tmsriram@google.com>2012-08-24 18:35:35 +0000
commit16164a6b00372ebc0360f6aa71337e5613278817 (patch)
tree503893149fa2b29775eafe985a0a537cf7433132 /gold/layout.h
parent92a289b3800274d15d440cea98c0df067da4c2ec (diff)
Patch adds support to allow plugins to map selected subset of sections to unique
segments. 2012-08-24 Sriraman Tallam <tmsriram@google.com> * gold.cc (queue_middle_tasks): Call layout again when unique segments for sections is desired. * layout.cc (Layout::Layout): Initialize new members. (Layout::get_output_section_flags): New function. (Layout::choose_output_section): Call get_output_section_flags. (Layout::layout): Make output section for mapping to a unique segment. (Layout::insert_section_segment_map): New function. (Layout::attach_allocated_section_to_segment): Make unique segment for output sections marked so. (Layout::segment_precedes): Check for unique segments when sorting. * layout.h (Layout::Unique_segment_info): New struct. (Layout::Section_segment_map): New typedef. (Layout::insert_section_segment_map): New function. (Layout::get_output_section_flags): New function. (Layout::is_unique_segment_for_sections_specified): New function. (Layout::set_unique_segment_for_sections_specified): New function. (Layout::unique_segment_for_sections_specified_): New member. (Layout::section_segment_map_): New member. * object.cc (Sized_relobj_file<size, big_endian>::do_layout): Rename is_gc_pass_one to is_pass_one. Rename is_gc_pass_two to is_pass_two. Rename is_gc_or_icf to is_two_pass. Check for which pass based on whether symbols data is present. Make it two pass when unique segments for sections is desired. * output.cc (Output_section::Output_section): Initialize new members. * output.h (Output_section::is_unique_segment): New function. (Output_section::set_is_unique_segment): New function. (Output_section::is_unique_segment_): New member. (Output_section::extra_segment_flags): New function. (Output_section::set_extra_segment_flags): New function. (Output_section::extra_segment_flags_): New member. (Output_section::segment_alignment): New function. (Output_section::set_segment_alignment): New function. (Output_section::segment_alignment_): New member. (Output_segment::Output_segment): Initialize is_unique_segment_. (Output_segment::is_unique_segment): New function. (Output_segment::set_is_unique_segment): New function. (Output_segment::is_unique_segment_): New member. * plugin.cc (allow_unique_segment_for_sections): New function. (unique_segment_for_sections): New function. (Plugin::load): Add new functions to transfer vector. * Makefile.am (plugin_final_layout.readelf.stdout): Add readelf output. * Makefile.in: Regenerate. * testsuite/plugin_final_layout.sh: Check if unique segment functionality works. * testsuite/plugin_section_order.c (onload): Check if new interfaces are available. (allow_unique_segment_for_sections): New global. (unique_segment_for_sections): New global. (claim_file_hook): Call allow_unique_segment_for_sections. (all_symbols_read_hook): Call unique_segment_for_sections. 2012-08-24 Sriraman Tallam <tmsriram@google.com> * plugin-api.h (ld_plugin_allow_unique_segment_for_sections): New interface. (ld_plugin_unique_segment_for_sections): New interface. (LDPT_ALLOW_UNIQUE_SEGMENT_FOR_SECTIONS): New enum val. (LDPT_UNIQUE_SEGMENT_FOR_SECTIONS): New enum val. (tv_allow_unique_segment_for_sections): New member. (tv_unique_segment_for_sections): New member.
Diffstat (limited to 'gold/layout.h')
-rw-r--r--gold/layout.h46
1 files changed, 46 insertions, 0 deletions
diff --git a/gold/layout.h b/gold/layout.h
index fe5c696f2a..94745a6e68 100644
--- a/gold/layout.h
+++ b/gold/layout.h
@@ -528,6 +528,31 @@ class Layout
get_section_order_map()
{ return &this->section_order_map_; }
+ // Struct to store segment info when mapping some input sections to
+ // unique segments using linker plugins. Mapping an input section to
+ // a unique segment is done by first placing such input sections in
+ // unique output sections and then mapping the output section to a
+ // unique segment. NAME is the name of the output section. FLAGS
+ // and ALIGN are the extra flags and alignment of the segment.
+ struct Unique_segment_info
+ {
+ // Identifier for the segment. ELF segments dont have names. This
+ // is used as the name of the output section mapped to the segment.
+ const char* name;
+ // Additional segment flags.
+ uint64_t flags;
+ // Segment alignment.
+ uint64_t align;
+ };
+
+ // Mapping from input section to segment.
+ typedef std::map<Const_section_id, Unique_segment_info*>
+ Section_segment_map;
+
+ // Maps section SECN to SEGMENT s.
+ void
+ insert_section_segment_map(Const_section_id secn, Unique_segment_info *s);
+
bool
is_section_ordering_specified()
{ return this->section_ordering_specified_; }
@@ -536,6 +561,14 @@ class Layout
set_section_ordering_specified()
{ this->section_ordering_specified_ = true; }
+ bool
+ is_unique_segment_for_sections_specified() const
+ { return this->unique_segment_for_sections_specified_; }
+
+ void
+ set_unique_segment_for_sections_specified()
+ { this->unique_segment_for_sections_specified_ = true; }
+
// For incremental updates, allocate a block of memory from the
// free list. Find a block starting at or after MINOFF.
off_t
@@ -1070,6 +1103,11 @@ class Layout
elfcpp::Elf_Word type, elfcpp::Elf_Xword flags,
Output_section_order order, bool is_relro);
+ // Clear the input section flags that should not be copied to the
+ // output section.
+ elfcpp::Elf_Xword
+ get_output_section_flags (elfcpp::Elf_Xword input_section_flags);
+
// Choose the output section for NAME in RELOBJ.
Output_section*
choose_output_section(const Relobj* relobj, const char* name,
@@ -1336,6 +1374,9 @@ class Layout
// True if the input sections in the output sections should be sorted
// as specified in a section ordering file.
bool section_ordering_specified_;
+ // True if some input sections need to be mapped to a unique segment,
+ // after being mapped to a unique Output_section.
+ bool unique_segment_for_sections_specified_;
// In incremental build, holds information check the inputs and build the
// .gnu_incremental_inputs section.
Incremental_inputs* incremental_inputs_;
@@ -1350,6 +1391,11 @@ class Layout
// Plugins specify section_ordering using this map. This is set in
// update_section_order in plugin.cc
std::map<Section_id, unsigned int> section_order_map_;
+ // This maps an input section to a unique segment. This is done by first
+ // placing such input sections in unique output sections and then mapping
+ // the output section to a unique segment. Unique_segment_info stores
+ // any additional flags and alignment of the new segment.
+ Section_segment_map section_segment_map_;
// Hash a pattern to its position in the section ordering file.
Unordered_map<std::string, unsigned int> input_section_position_;
// Vector of glob only patterns in the section_ordering file.