From eabc84f4848311a68f65df04e428c8b53a92f1c0 Mon Sep 17 00:00:00 2001 From: Roland McGrath Date: Fri, 22 Jun 2012 18:02:24 +0000 Subject: gold/ * layout.cc (finalize): Define __ehdr_start symbol if applicable. --- gold/ChangeLog | 4 ++++ gold/layout.cc | 10 ++++++++++ 2 files changed, 14 insertions(+) (limited to 'gold') 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 + + * layout.cc (finalize): Define __ehdr_start symbol if applicable. + 2012-06-12 Rafael Ávila de Espíndola * 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 -- cgit v1.1