gold/
authorRoland McGrath <roland@gnu.org>
Fri, 22 Jun 2012 18:02:24 +0000 (18:02 +0000)
committerRoland McGrath <roland@gnu.org>
Fri, 22 Jun 2012 18:02:24 +0000 (18:02 +0000)
* layout.cc (finalize): Define __ehdr_start symbol if applicable.

gold/ChangeLog
gold/layout.cc

index 75fda65..6017530 100644 (file)
@@ -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.
index 154be88..ad667ab 100644 (file)
@@ -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