aboutsummaryrefslogtreecommitdiff
path: root/gold/script-sections.cc
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>2011-06-17 13:00:01 +0000
committerIan Lance Taylor <ian@airs.com>2011-06-17 13:00:01 +0000
commit10b4f10252b11483486df1be14037c1dd4c554bb (patch)
treecd5b9ad273ca38fe1c6842608821c8a6dd516d7c /gold/script-sections.cc
parente588ea8da03e217869ea9c6533382f7bbfc5a474 (diff)
downloadgdb-10b4f10252b11483486df1be14037c1dd4c554bb.zip
gdb-10b4f10252b11483486df1be14037c1dd4c554bb.tar.gz
gdb-10b4f10252b11483486df1be14037c1dd4c554bb.tar.bz2
PR gold/12880
* layout.h (class Layout): Add interp_segment_ field. * layout.cc (Layout::Layout): Initialize interp_segment_ field. (Layout::attach_allocated_section_to_segment): If making shared library, put .interp section in PT_INTERP segment. (Layout::finalize): Also call create_interp if -dynamic-linker option was used. (Layout::create_interp): Assert that there is no PT_INTERP segment. If not using a SECTIONS clause, use make_output_section. (Layout::make_output_segment): Set interp_segment_ if PT_INTERP. * script-sections.cc (Script_sections::create_note_and_tls_segments): If making shared library, put .interp section in PT_INTERP segment.
Diffstat (limited to 'gold/script-sections.cc')
-rw-r--r--gold/script-sections.cc15
1 files changed, 15 insertions, 0 deletions
diff --git a/gold/script-sections.cc b/gold/script-sections.cc
index 3bcc9e6..67e3d65 100644
--- a/gold/script-sections.cc
+++ b/gold/script-sections.cc
@@ -3936,6 +3936,21 @@ Script_sections::create_note_and_tls_segments(
saw_tls = true;
}
+
+ // If we are making a shared library, and we see a section named
+ // .interp, and the -dynamic-linker option was not used, then
+ // put the .interp section in a PT_INTERP segment. This is for
+ // GNU ld compatibility.
+ if (strcmp((*p)->name(), ".interp") == 0
+ && parameters->options().shared()
+ && parameters->options().dynamic_linker() == NULL)
+ {
+ elfcpp::Elf_Word seg_flags =
+ Layout::section_flags_to_segment((*p)->flags());
+ Output_segment* oseg = layout->make_output_segment(elfcpp::PT_INTERP,
+ seg_flags);
+ oseg->add_output_section_to_nonload(*p, seg_flags);
+ }
}
}