diff options
-rw-r--r-- | gold/ChangeLog | 4 | ||||
-rw-r--r-- | gold/layout.cc | 10 |
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 |