From: Doug Kwan Date: Thu, 15 Mar 2012 18:24:06 +0000 (+0000) Subject: 2012-03-15 Doug Kwan X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7b8957f8c3b4054061363abdc38bbbf0a3b20635;p=binutils-gdb.git 2012-03-15 Doug Kwan * arm.cc (Target_arm::got_section): Make .got section read-only if -z now is given. --- diff --git a/gold/ChangeLog b/gold/ChangeLog index 0c1a7e1cf59..447961833f0 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,8 @@ +2012-03-15 Doug Kwan + + * arm.cc (Target_arm::got_section): Make .got section read-only + if -z now is given. + 2012-03-15 Ian Lance Taylor PR gold/13850 diff --git a/gold/arm.cc b/gold/arm.cc index 04004a68c13..32a4638e430 100644 --- a/gold/arm.cc +++ b/gold/arm.cc @@ -4174,11 +4174,22 @@ Target_arm::got_section(Symbol_table* symtab, Layout* layout) { gold_assert(symtab != NULL && layout != NULL); + // When using -z now, we can treat .got as a relro section. + // Without -z now, it is modified after program startup by lazy + // PLT relocations. + bool is_got_relro = parameters->options().now(); + Output_section_order got_order = (is_got_relro + ? ORDER_RELRO_LAST + : ORDER_DATA); + + // Unlike some targets (.e.g x86), ARM does not use separate .got and + // .got.plt sections in output. The output .got section contains both + // PLT and non-PLT GOT entries. this->got_ = new Arm_output_data_got(symtab, layout); layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE), - this->got_, ORDER_DATA, false); + this->got_, got_order, is_got_relro); // The old GNU linker creates a .got.plt section. We just // create another set of data in the .got section. Note that we @@ -4187,7 +4198,7 @@ Target_arm::got_section(Symbol_table* symtab, Layout* layout) this->got_plt_ = new Output_data_space(4, "** GOT PLT"); layout->add_output_section_data(".got", elfcpp::SHT_PROGBITS, (elfcpp::SHF_ALLOC | elfcpp::SHF_WRITE), - this->got_plt_, ORDER_DATA, false); + this->got_plt_, got_order, is_got_relro); // The first three entries are reserved. this->got_plt_->set_current_data_size(3 * 4);