This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
gold patch committed: Another elflint fix
- From: Ian Lance Taylor <iant at google dot com>
- To: binutils at sourceware dot org
- Date: Tue, 29 Dec 2009 20:18:39 -0800
- Subject: gold patch committed: Another elflint fix
The elflint program wants the size of the _DYNAMIC symbol to be the
size of the dynamic data. I don't see any reference to this in the
ELF ABI, but it seems like a reasonable thing to do anyhow. I
committed this patch to do it.
Ian
2009-12-29 Ian Lance Taylor <iant@google.com>
PR 10450
* layout.cc (Layout::Layout): Initialize dynamic_symbol_ field.
(Layout::create_initial_dynamic_sections): Set dynamic_symbol_.
(Layout::finalize): Call set_dynamic_symbol_size.
(Layout::set_dynamic_symbol_size): New function.
* layout.h (class Layout): Add dynamic_symbol_ field. Declare
set_dynamic_symbol_size.
Index: layout.cc
===================================================================
RCS file: /cvs/src/src/gold/layout.cc,v
retrieving revision 1.150
diff -p -u -r1.150 layout.cc
--- layout.cc 29 Dec 2009 00:31:48 -0000 1.150
+++ layout.cc 30 Dec 2009 04:15:09 -0000
@@ -180,6 +180,7 @@ Layout::Layout(int number_of_input_files
dynsym_section_(NULL),
dynsym_xindex_(NULL),
dynamic_section_(NULL),
+ dynamic_symbol_(NULL),
dynamic_data_(NULL),
eh_frame_section_(NULL),
eh_frame_data_(NULL),
@@ -1161,10 +1162,11 @@ Layout::create_initial_dynamic_sections(
false, false, true);
this->dynamic_section_->set_is_relro();
- symtab->define_in_output_data("_DYNAMIC", NULL, Symbol_table::PREDEFINED,
- this->dynamic_section_, 0, 0,
- elfcpp::STT_OBJECT, elfcpp::STB_LOCAL,
- elfcpp::STV_HIDDEN, 0, false, false);
+ this->dynamic_symbol_ =
+ symtab->define_in_output_data("_DYNAMIC", NULL, Symbol_table::PREDEFINED,
+ this->dynamic_section_, 0, 0,
+ elfcpp::STT_OBJECT, elfcpp::STB_LOCAL,
+ elfcpp::STV_HIDDEN, 0, false, false);
this->dynamic_data_ = new Output_data_dynamic(&this->dynpool_);
@@ -1580,6 +1582,10 @@ Layout::finalize(const Input_objects* in
// dynamic string table is complete.
this->create_version_sections(&versions, symtab, local_dynamic_count,
dynamic_symbols, dynstr);
+
+ // Set the size of the _DYNAMIC symbol. We can't do this until
+ // after we call create_version_sections.
+ this->set_dynamic_symbol_size(symtab);
}
if (this->incremental_inputs_)
@@ -3303,6 +3309,24 @@ Layout::finish_dynamic_section(const Inp
odyn->add_constant(elfcpp::DT_FLAGS_1, flags);
}
+// Set the size of the _DYNAMIC symbol table to be the size of the
+// dynamic data.
+
+void
+Layout::set_dynamic_symbol_size(const Symbol_table* symtab)
+{
+ Output_data_dynamic* const odyn = this->dynamic_data_;
+ odyn->finalize_data_size();
+ off_t data_size = odyn->data_size();
+ const int size = parameters->target().get_size();
+ if (size == 32)
+ symtab->get_sized_symbol<32>(this->dynamic_symbol_)->set_symsize(data_size);
+ else if (size == 64)
+ symtab->get_sized_symbol<64>(this->dynamic_symbol_)->set_symsize(data_size);
+ else
+ gold_unreachable();
+}
+
// The mapping of input section name prefixes to output section names.
// In some cases one prefix is itself a prefix of another prefix; in
// such a case the longer prefix must come first. These prefixes are
Index: layout.h
===================================================================
RCS file: /cvs/src/src/gold/layout.h,v
retrieving revision 1.73
diff -p -u -r1.73 layout.h
--- layout.h 14 Dec 2009 19:53:05 -0000 1.73
+++ layout.h 30 Dec 2009 04:15:10 -0000
@@ -708,6 +708,10 @@ class Layout
void
finish_dynamic_section(const Input_objects*, const Symbol_table*);
+ // Set the size of the _DYNAMIC symbol.
+ void
+ set_dynamic_symbol_size(const Symbol_table*);
+
// Create the .interp section and PT_INTERP segment.
void
create_interp(const Target* target);
@@ -947,6 +951,8 @@ class Layout
Output_symtab_xindex* dynsym_xindex_;
// The SHT_DYNAMIC output section if there is one.
Output_section* dynamic_section_;
+ // The _DYNAMIC symbol if there is one.
+ Symbol* dynamic_symbol_;
// The dynamic data which goes into dynamic_section_.
Output_data_dynamic* dynamic_data_;
// The exception frame output section if there is one.