mirror of
https://github.com/bminor/binutils-gdb.git
synced 2025-12-27 09:38:57 +00:00
* 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.
This commit is contained in:
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user