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/x86_64.cc | |
parent | f0ba79e29c2b6fd25f66a9c1050cd09f6e069513 (diff) | |
download | gdb-1a2dff539bff0b85f89b2f8f0c30dab1851f59a5.zip gdb-1a2dff539bff0b85f89b2f8f0c30dab1851f59a5.tar.gz gdb-1a2dff539bff0b85f89b2f8f0c30dab1851f59a5.tar.bz2 |
* 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/x86_64.cc')
-rw-r--r-- | gold/x86_64.cc | 25 |
1 files changed, 13 insertions, 12 deletions
diff --git a/gold/x86_64.cc b/gold/x86_64.cc index c1597c1..4635799 100644 --- a/gold/x86_64.cc +++ b/gold/x86_64.cc @@ -469,23 +469,22 @@ Target_x86_64::got_section(Symbol_table* symtab, Layout* layout) os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE), - this->got_, false); - os->set_is_relro(); + this->got_, false, true, true, + false); - // The old GNU linker creates a .got.plt section. We just - // create another set of data in the .got section. Note that we - // always create a PLT if we create a GOT, although the PLT - // might be empty. this->got_plt_ = new Output_data_space(8, "** GOT PLT"); - os = layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, + os = layout->add_output_section_data(".got.plt", elfcpp::SHT_PROGBITS, (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE), - this->got_plt_, false); - os->set_is_relro(); + this->got_plt_, false, false, + false, true); // The first three entries are reserved. this->got_plt_->set_current_data_size(3 * 8); + // Those bytes can go into the relro segment. + layout->increase_relro(3 * 8); + // Define _GLOBAL_OFFSET_TABLE_ at the start of the PLT. symtab->define_in_output_data("_GLOBAL_OFFSET_TABLE_", NULL, Symbol_table::PREDEFINED, @@ -509,7 +508,8 @@ Target_x86_64::rela_dyn_section(Layout* layout) gold_assert(layout != NULL); this->rela_dyn_ = new Reloc_section(parameters->options().combreloc()); layout->add_output_section_data(".rela.dyn", elfcpp::SHT_RELA, - elfcpp::SHF_ALLOC, this->rela_dyn_, true); + elfcpp::SHF_ALLOC, this->rela_dyn_, true, + false, false, false); } return this->rela_dyn_; } @@ -609,7 +609,8 @@ Output_data_plt_x86_64::Output_data_plt_x86_64(Layout* layout, { this->rel_ = new Reloc_section(false); layout->add_output_section_data(".rela.plt", elfcpp::SHT_RELA, - elfcpp::SHF_ALLOC, this->rel_, true); + elfcpp::SHF_ALLOC, this->rel_, true, + false, false, false); } void @@ -805,7 +806,7 @@ Target_x86_64::make_plt_section(Symbol_table* symtab, Layout* layout) layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS, (elfcpp::SHF_ALLOC | elfcpp::SHF_EXECINSTR), - this->plt_, false); + this->plt_, false, false, false, false); } } |