diff options
author | Ian Lance Taylor <ian@airs.com> | 2011-06-17 13:00:01 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2011-06-17 13:00:01 +0000 |
commit | 10b4f10252b11483486df1be14037c1dd4c554bb (patch) | |
tree | cd5b9ad273ca38fe1c6842608821c8a6dd516d7c /gold/script-sections.cc | |
parent | e588ea8da03e217869ea9c6533382f7bbfc5a474 (diff) | |
download | gdb-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.cc | 15 |
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); + } } } |