mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-21 02:24:17 +08:00
* output.h (Output_data_dynamic::add_section_size): New method
that takes two Output_data objects. (Output_data_dynamic::Dynamic_entry): Create storage for secondary entry param. Handle it in initializers. * output.cc (Output_data_dynamic::Dynamic_entry::write): For DYNAMIC_SECTION_SIZE, add in second object size if non-NULL. * layout.h (Layout::add_target_dynamic_tags): Add dynrel_includes_plt arg. * layout.cc (Layout::add_target_dynamic_tags): If dynrel_includes_plt, and .rela.plt exists, set DT_REL{,A}SZ to sum of .rela.dyn and .rela.plt * arm.cc (Target_arm::do_finalize_sections): Update to pass false for dynrel_includes_plt. * i386.cc (Target_i386::do_finalize_sections): Likewise. * x86_64.cc (Target_x86_64::do_finalize_sections): Likewise. * sparc.cc (Target_sparc::make_plt_entry): Force .rela.dyn to be output before .rela.plt (Target_sparc::do_finalize_sections): Update to pass true for dynrel_includes_plt. * powerpc.cc (Target_powerpc::make_plt_entry): Force .rela.dyn to be output before .rela.plt (Target_powerpc::do_finalize_sections): Update to pass true for dynrel_includes_plt when 32-bit.
This commit is contained in:
@ -4,6 +4,29 @@
|
|||||||
R_SPARC_RELATIVE using ->add_local_relative().
|
R_SPARC_RELATIVE using ->add_local_relative().
|
||||||
(Target_sparc::Scan::global): Likewise for ->add_global_relative().
|
(Target_sparc::Scan::global): Likewise for ->add_global_relative().
|
||||||
|
|
||||||
|
* output.h (Output_data_dynamic::add_section_size): New method
|
||||||
|
that takes two Output_data objects.
|
||||||
|
(Output_data_dynamic::Dynamic_entry): Create storage for secondary
|
||||||
|
entry param. Handle it in initializers.
|
||||||
|
* output.cc (Output_data_dynamic::Dynamic_entry::write): For
|
||||||
|
DYNAMIC_SECTION_SIZE, add in second object size if non-NULL.
|
||||||
|
* layout.h (Layout::add_target_dynamic_tags): Add dynrel_includes_plt
|
||||||
|
arg.
|
||||||
|
* layout.cc (Layout::add_target_dynamic_tags): If dynrel_includes_plt,
|
||||||
|
and .rela.plt exists, set DT_REL{,A}SZ to sum of .rela.dyn and .rela.plt
|
||||||
|
* arm.cc (Target_arm::do_finalize_sections): Update to pass false
|
||||||
|
for dynrel_includes_plt.
|
||||||
|
* i386.cc (Target_i386::do_finalize_sections): Likewise.
|
||||||
|
* x86_64.cc (Target_x86_64::do_finalize_sections): Likewise.
|
||||||
|
* sparc.cc (Target_sparc::make_plt_entry): Force .rela.dyn to be output
|
||||||
|
before .rela.plt
|
||||||
|
(Target_sparc::do_finalize_sections): Update to pass true for
|
||||||
|
dynrel_includes_plt.
|
||||||
|
* powerpc.cc (Target_powerpc::make_plt_entry): Force .rela.dyn to be
|
||||||
|
output before .rela.plt
|
||||||
|
(Target_powerpc::do_finalize_sections): Update to pass true for
|
||||||
|
dynrel_includes_plt when 32-bit.
|
||||||
|
|
||||||
2010-02-08 Doug Kwan <dougkwan@google.com>
|
2010-02-08 Doug Kwan <dougkwan@google.com>
|
||||||
|
|
||||||
* arm.cc (Arm_relobj::simple_input_section_output_address): New
|
* arm.cc (Arm_relobj::simple_input_section_output_address): New
|
||||||
|
@ -7094,7 +7094,7 @@ Target_arm<big_endian>::do_finalize_sections(
|
|||||||
? NULL
|
? NULL
|
||||||
: this->plt_->rel_plt());
|
: this->plt_->rel_plt());
|
||||||
layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
|
layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
|
||||||
this->rel_dyn_, true);
|
this->rel_dyn_, true, false);
|
||||||
|
|
||||||
// Emit any relocs we saved in an attempt to avoid generating COPY
|
// Emit any relocs we saved in an attempt to avoid generating COPY
|
||||||
// relocs.
|
// relocs.
|
||||||
|
@ -1609,7 +1609,7 @@ Target_i386::do_finalize_sections(
|
|||||||
? NULL
|
? NULL
|
||||||
: this->plt_->rel_plt());
|
: this->plt_->rel_plt());
|
||||||
layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
|
layout->add_target_dynamic_tags(true, this->got_plt_, rel_plt,
|
||||||
this->rel_dyn_, true);
|
this->rel_dyn_, true, false);
|
||||||
|
|
||||||
// Emit any relocs we saved in an attempt to avoid generating COPY
|
// Emit any relocs we saved in an attempt to avoid generating COPY
|
||||||
// relocs.
|
// relocs.
|
||||||
|
@ -3240,7 +3240,7 @@ void
|
|||||||
Layout::add_target_dynamic_tags(bool use_rel, const Output_data* plt_got,
|
Layout::add_target_dynamic_tags(bool use_rel, const Output_data* plt_got,
|
||||||
const Output_data* plt_rel,
|
const Output_data* plt_rel,
|
||||||
const Output_data_reloc_generic* dyn_rel,
|
const Output_data_reloc_generic* dyn_rel,
|
||||||
bool add_debug)
|
bool add_debug, bool dynrel_includes_plt)
|
||||||
{
|
{
|
||||||
Output_data_dynamic* odyn = this->dynamic_data_;
|
Output_data_dynamic* odyn = this->dynamic_data_;
|
||||||
if (odyn == NULL)
|
if (odyn == NULL)
|
||||||
@ -3261,6 +3261,10 @@ Layout::add_target_dynamic_tags(bool use_rel, const Output_data* plt_got,
|
|||||||
{
|
{
|
||||||
odyn->add_section_address(use_rel ? elfcpp::DT_REL : elfcpp::DT_RELA,
|
odyn->add_section_address(use_rel ? elfcpp::DT_REL : elfcpp::DT_RELA,
|
||||||
dyn_rel);
|
dyn_rel);
|
||||||
|
if (plt_rel != NULL && dynrel_includes_plt)
|
||||||
|
odyn->add_section_size(use_rel ? elfcpp::DT_RELSZ : elfcpp::DT_RELASZ,
|
||||||
|
dyn_rel, plt_rel);
|
||||||
|
else
|
||||||
odyn->add_section_size(use_rel ? elfcpp::DT_RELSZ : elfcpp::DT_RELASZ,
|
odyn->add_section_size(use_rel ? elfcpp::DT_RELSZ : elfcpp::DT_RELASZ,
|
||||||
dyn_rel);
|
dyn_rel);
|
||||||
const int size = parameters->target().get_size();
|
const int size = parameters->target().get_size();
|
||||||
|
@ -563,7 +563,7 @@ class Layout
|
|||||||
add_target_dynamic_tags(bool use_rel, const Output_data* plt_got,
|
add_target_dynamic_tags(bool use_rel, const Output_data* plt_got,
|
||||||
const Output_data* plt_rel,
|
const Output_data* plt_rel,
|
||||||
const Output_data_reloc_generic* dyn_rel,
|
const Output_data_reloc_generic* dyn_rel,
|
||||||
bool add_debug);
|
bool add_debug, bool dynrel_includes_plt);
|
||||||
|
|
||||||
// Compute and write out the build ID if needed.
|
// Compute and write out the build ID if needed.
|
||||||
void
|
void
|
||||||
|
@ -1560,6 +1560,8 @@ Output_data_dynamic::Dynamic_entry::write(
|
|||||||
|
|
||||||
case DYNAMIC_SECTION_SIZE:
|
case DYNAMIC_SECTION_SIZE:
|
||||||
val = this->u_.od->data_size();
|
val = this->u_.od->data_size();
|
||||||
|
if (this->od2 != NULL)
|
||||||
|
val += this->od2->data_size();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DYNAMIC_SYMBOL:
|
case DYNAMIC_SYMBOL:
|
||||||
|
@ -1997,6 +1997,12 @@ class Output_data_dynamic : public Output_section_data
|
|||||||
add_section_size(elfcpp::DT tag, const Output_data* od)
|
add_section_size(elfcpp::DT tag, const Output_data* od)
|
||||||
{ this->add_entry(Dynamic_entry(tag, od, true)); }
|
{ this->add_entry(Dynamic_entry(tag, od, true)); }
|
||||||
|
|
||||||
|
// Add a new dynamic entry with the total size of two output datas.
|
||||||
|
void
|
||||||
|
add_section_size(elfcpp::DT tag, const Output_data* od,
|
||||||
|
const Output_data* od2)
|
||||||
|
{ this->add_entry(Dynamic_entry(tag, od, od2)); }
|
||||||
|
|
||||||
// Add a new dynamic entry with the address of a symbol.
|
// Add a new dynamic entry with the address of a symbol.
|
||||||
void
|
void
|
||||||
add_symbol(elfcpp::DT tag, const Symbol* sym)
|
add_symbol(elfcpp::DT tag, const Symbol* sym)
|
||||||
@ -2045,7 +2051,19 @@ class Output_data_dynamic : public Output_section_data
|
|||||||
offset_(section_size
|
offset_(section_size
|
||||||
? DYNAMIC_SECTION_SIZE
|
? DYNAMIC_SECTION_SIZE
|
||||||
: DYNAMIC_SECTION_ADDRESS)
|
: DYNAMIC_SECTION_ADDRESS)
|
||||||
{ this->u_.od = od; }
|
{
|
||||||
|
this->u_.od = od;
|
||||||
|
this->od2 = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create an entry with the size of two sections.
|
||||||
|
Dynamic_entry(elfcpp::DT tag, const Output_data* od, const Output_data* od2)
|
||||||
|
: tag_(tag),
|
||||||
|
offset_(DYNAMIC_SECTION_SIZE)
|
||||||
|
{
|
||||||
|
this->u_.od = od;
|
||||||
|
this->od2 = od2;
|
||||||
|
}
|
||||||
|
|
||||||
// Create an entry with the address of a section plus a constant offset.
|
// Create an entry with the address of a section plus a constant offset.
|
||||||
Dynamic_entry(elfcpp::DT tag, const Output_data* od, unsigned int offset)
|
Dynamic_entry(elfcpp::DT tag, const Output_data* od, unsigned int offset)
|
||||||
@ -2101,6 +2119,8 @@ class Output_data_dynamic : public Output_section_data
|
|||||||
// For DYNAMIC_STRING.
|
// For DYNAMIC_STRING.
|
||||||
const char* str;
|
const char* str;
|
||||||
} u_;
|
} u_;
|
||||||
|
// For DYNAMIC_SYMBOL with two sections.
|
||||||
|
const Output_data* od2;
|
||||||
// The dynamic tag.
|
// The dynamic tag.
|
||||||
elfcpp::DT tag_;
|
elfcpp::DT tag_;
|
||||||
// The type of entry (Classification) or offset within a section.
|
// The type of entry (Classification) or offset within a section.
|
||||||
|
@ -948,6 +948,11 @@ Target_powerpc<size, big_endian>::make_plt_entry(Symbol_table* symtab,
|
|||||||
// Create the GOT section first.
|
// Create the GOT section first.
|
||||||
this->got_section(symtab, layout);
|
this->got_section(symtab, layout);
|
||||||
|
|
||||||
|
// Ensure that .rela.dyn always appears before .rela.plt This is
|
||||||
|
// necessary due to how, on PowerPC and some other targets, .rela.dyn
|
||||||
|
// needs to include .rela.plt in it's range.
|
||||||
|
this->rela_dyn_section(layout);
|
||||||
|
|
||||||
this->plt_ = new Output_data_plt_powerpc<size, big_endian>(layout);
|
this->plt_ = new Output_data_plt_powerpc<size, big_endian>(layout);
|
||||||
layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
|
layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
|
||||||
(elfcpp::SHF_ALLOC
|
(elfcpp::SHF_ALLOC
|
||||||
@ -1556,7 +1561,7 @@ Target_powerpc<size, big_endian>::do_finalize_sections(
|
|||||||
? NULL
|
? NULL
|
||||||
: this->plt_->rel_plt());
|
: this->plt_->rel_plt());
|
||||||
layout->add_target_dynamic_tags(false, this->plt_, rel_plt,
|
layout->add_target_dynamic_tags(false, this->plt_, rel_plt,
|
||||||
this->rela_dyn_, true);
|
this->rela_dyn_, true, size == 32);
|
||||||
|
|
||||||
// Emit any relocs we saved in an attempt to avoid generating COPY
|
// Emit any relocs we saved in an attempt to avoid generating COPY
|
||||||
// relocs.
|
// relocs.
|
||||||
|
@ -1369,6 +1369,11 @@ Target_sparc<size, big_endian>::make_plt_entry(Symbol_table* symtab,
|
|||||||
// Create the GOT sections first.
|
// Create the GOT sections first.
|
||||||
this->got_section(symtab, layout);
|
this->got_section(symtab, layout);
|
||||||
|
|
||||||
|
// Ensure that .rela.dyn always appears before .rela.plt This is
|
||||||
|
// necessary due to how, on Sparc and some other targets, .rela.dyn
|
||||||
|
// needs to include .rela.plt in it's range.
|
||||||
|
this->rela_dyn_section(layout);
|
||||||
|
|
||||||
this->plt_ = new Output_data_plt_sparc<size, big_endian>(layout);
|
this->plt_ = new Output_data_plt_sparc<size, big_endian>(layout);
|
||||||
layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
|
layout->add_output_section_data(".plt", elfcpp::SHT_PROGBITS,
|
||||||
(elfcpp::SHF_ALLOC
|
(elfcpp::SHF_ALLOC
|
||||||
@ -2338,7 +2343,7 @@ Target_sparc<size, big_endian>::do_finalize_sections(
|
|||||||
? NULL
|
? NULL
|
||||||
: this->plt_->rel_plt());
|
: this->plt_->rel_plt());
|
||||||
layout->add_target_dynamic_tags(false, this->plt_, rel_plt,
|
layout->add_target_dynamic_tags(false, this->plt_, rel_plt,
|
||||||
this->rela_dyn_, true);
|
this->rela_dyn_, true, true);
|
||||||
|
|
||||||
// Emit any relocs we saved in an attempt to avoid generating COPY
|
// Emit any relocs we saved in an attempt to avoid generating COPY
|
||||||
// relocs.
|
// relocs.
|
||||||
|
@ -1741,7 +1741,7 @@ Target_x86_64::do_finalize_sections(
|
|||||||
? NULL
|
? NULL
|
||||||
: this->plt_->rela_plt());
|
: this->plt_->rela_plt());
|
||||||
layout->add_target_dynamic_tags(false, this->got_plt_, rel_plt,
|
layout->add_target_dynamic_tags(false, this->got_plt_, rel_plt,
|
||||||
this->rela_dyn_, true);
|
this->rela_dyn_, true, false);
|
||||||
|
|
||||||
// Fill in some more dynamic tags.
|
// Fill in some more dynamic tags.
|
||||||
Output_data_dynamic* const odyn = layout->dynamic_data();
|
Output_data_dynamic* const odyn = layout->dynamic_data();
|
||||||
|
Reference in New Issue
Block a user