diff options
author | Ian Lance Taylor <ian@airs.com> | 2009-12-30 06:57:17 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2009-12-30 06:57:17 +0000 |
commit | 1a2dff539bff0b85f89b2f8f0c30dab1851f59a5 (patch) | |
tree | 549fd584889a912f8d7aec63610c52b2969dee96 /gold/layout.h | |
parent | f0ba79e29c2b6fd25f66a9c1050cd09f6e069513 (diff) | |
download | ppe42-binutils-1a2dff539bff0b85f89b2f8f0c30dab1851f59a5.tar.gz ppe42-binutils-1a2dff539bff0b85f89b2f8f0c30dab1851f59a5.zip |
* layout.cc (Layout::Layout): Initialize increase_relro_.
(Layout::get_output_section): Add is_relro, is_last_relro, and
is_first_non_relro parameters. Change all callers.
(Layout::choose_output_section): Likewise.
(Layout::add_output_section_data): Likewise.
(Layout::make_output_section): Likewise.
(Layout::set_segment_offsets): Clear increase_relro when using a
linker script.
* layout.h (class Layout): Add increase_relro method. Add
increase_relro_ field. Update declarations.
* output.cc (Output_section::Output_section): Initialize
is_last_relro_ and is_first_non_relro_.
(Output_segment::add_output_section): Group relro sections is
do_sort is true. Handle is_last_relro and is_first_non_relro.
(Output_segment::maximum_alignment): Remove relro handling.
(Output_segment::set_section_addresses): Add increase_relro
parameter. Change all callers. Add initial alignment to align
relro sections on separate page. Remove old relro handling.
(Output_segment::set_section_list_addresses): Remove in_relro
parameter. Change all callers.
(Output_segment::set_offset): Add increase parameter. Change all
callers. Remove old relro handling.
* output.h (class Output_section): Add new methods: is_last_relro,
set_is_last_relro, is_first_non_relro, set_is_first_non_relro.
Add is_last_relro_ and is_first_non_relro_ fields.
* i386.cc (Target_i386::got_section): Don't call set_is_relro.
Create separate .got.plt section. Call increase_relro.
* x86_64.cc (Target_x86_64::got_section): Likewise.
* testsuite/relro_script_test.t: Add .got.plt.
Diffstat (limited to 'gold/layout.h')
-rw-r--r-- | gold/layout.h | 27 |
1 files changed, 22 insertions, 5 deletions
diff --git a/gold/layout.h b/gold/layout.h index 0437cf14da..06060effda 100644 --- a/gold/layout.h +++ b/gold/layout.h @@ -362,11 +362,21 @@ class Layout // Add an Output_section_data to the layout. This is used for // special sections like the GOT section. IS_DYNAMIC_LINKER_SECTION // is true for sections which are used by the dynamic linker, such - // as dynamic reloc sections. + // as dynamic reloc sections. IS_RELRO is true for relro sections. + // IS_LAST_RELRO is true for the last relro section. + // IS_FIRST_NON_RELRO is true for the first section after the relro + // sections. Output_section* add_output_section_data(const char* name, elfcpp::Elf_Word type, elfcpp::Elf_Xword flags, - Output_section_data*, bool is_dynamic_linker_section); + Output_section_data*, bool is_dynamic_linker_section, + bool is_relro, bool is_last_relro, + bool is_first_non_relro); + + // Increase the size of the relro segment by this much. + void + increase_relro(unsigned int s) + { this->increase_relro_ += s; } // Create dynamic sections if necessary. void @@ -752,20 +762,24 @@ class Layout Output_section* get_output_section(const char* name, Stringpool::Key name_key, elfcpp::Elf_Word type, elfcpp::Elf_Xword flags, - bool is_interp, bool is_dynamic_linker_section); + bool is_interp, bool is_dynamic_linker_section, + bool is_relro, bool is_last_relro, + bool is_first_non_relro); // Choose the output section for NAME in RELOBJ. Output_section* choose_output_section(const Relobj* relobj, const char* name, elfcpp::Elf_Word type, elfcpp::Elf_Xword flags, bool is_input_section, bool is_interp, - bool is_dynamic_linker_section); + bool is_dynamic_linker_section, bool is_relro, + bool is_last_relro, bool is_first_non_relro); // Create a new Output_section. Output_section* make_output_section(const char* name, elfcpp::Elf_Word type, elfcpp::Elf_Xword flags, bool is_interp, - bool is_dynamic_linker_section); + bool is_dynamic_linker_section, bool is_relro, + bool is_last_relro, bool is_first_non_relro); // Attach a section to a segment. void @@ -941,6 +955,9 @@ class Layout Output_segment* tls_segment_; // A pointer to the PT_GNU_RELRO segment if there is one. Output_segment* relro_segment_; + // A backend may increase the size of the PT_GNU_RELRO segment if + // there is one. This is the amount to increase it by. + unsigned int increase_relro_; // The SHT_SYMTAB output section. Output_section* symtab_section_; // The SHT_SYMTAB_SHNDX for the regular symbol table if there is one. |