aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gold/ChangeLog4
-rw-r--r--gold/layout.cc10
2 files changed, 14 insertions, 0 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog
index 75fda65..6017530 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,7 @@
+2012-06-22 Roland McGrath <mcgrathr@google.com>
+
+ * layout.cc (finalize): Define __ehdr_start symbol if applicable.
+
2012-06-12 Rafael Ávila de Espíndola <respindola@mozilla.com>
* plugin.cc (Plugin::load): Handle position independent executables.
diff --git a/gold/layout.cc b/gold/layout.cc
index 154be88..ad667ab 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -2509,6 +2509,16 @@ Layout::finalize(const Input_objects* input_objects, Symbol_table* symtab,
while (target->may_relax()
&& target->relax(pass, input_objects, symtab, this, task));
+ // If there is a load segment that contains the file and program headers,
+ // provide a symbol __ehdr_start pointing there.
+ // A program can use this to examine itself robustly.
+ if (load_seg != NULL)
+ symtab->define_in_output_segment("__ehdr_start", NULL,
+ Symbol_table::PREDEFINED, load_seg, 0, 0,
+ elfcpp::STT_NOTYPE, elfcpp::STB_GLOBAL,
+ elfcpp::STV_DEFAULT, 0,
+ Symbol::SEGMENT_START, true);
+
// Set the file offsets of all the non-data sections we've seen so
// far which don't have to wait for the input sections. We need
// this in order to finalize local symbols in non-allocated