RFC: Add SHT_GNU_PHDRS
H.J. Lu
hjl.tools@gmail.com
Thu Sep 27 04:35:00 GMT 2018
More information about the Binutils mailing list
Thu Sep 27 04:35:00 GMT 2018
- Previous message (by thread): RFC: Add SHT_GNU_PHDRS
- Next message (by thread): RFC: Add SHT_GNU_PHDRS
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Wed, Sep 26, 2018 at 8:25 PM, Carlos O'Donell <carlos@redhat.com> wrote: > On 9/26/18 5:53 PM, H.J. Lu wrote: >> When -z separate-code is used to create executable, ld won't place any >> data in the code-only PT_LOAD segment. If there are no data sections >> placed before the code-only PT_LOAD segment, the program headers >> won't be mapped into any PT_LOAD segment. When the executable tries >> to access it (based on the program header address passed in AT_PHDR), >> it will lead to segfault. >> >> I am proposing >> >> #define SHT_GNU_PHDRS 0x6ffffff4 /* Dummy section for program header */ >> >> This is a special read-only SHF_ALLOC zero-size data section. It is the >> first output section, which will force a data PT_LOAD segment with program >> header before the code-only PT_LOAD segment, > > This seems like a huge hack to me. Either ld ensures that the page-aligned > start of the PT_LOAD mapping includes the program headers, or we have to > define SHT_GNU_PHDRS as having exactly that semantic and we need to clearly > explain what a static linker needs to do to accomplish this task. What you > have here needs more documentation. It is to replace another hack: [hjl@gnu-cfl-1 ld]$ readelf -SWl tmpdir/pr23428 There are 13 section headers, starting at offset 0x2008: Section Headers: [Nr] Name Type Address Off Size ES Flg Lk Inf Al [ 0] NULL 0000000000000000 000000 000000 00 0 0 0 [ 1] .note.gnu.property NOTE 0000000000400120 000120 000020 00 A 0 0 8 [ 2] .text PROGBITS 0000000000401000 001000 00012d 00 AX 0 0 16 [ 3] .comment PROGBITS 0000000000000000 00112d 00002c 01 MS 0 0 1 [ 4] .debug_aranges PROGBITS 0000000000000000 001160 000060 00 0 0 16 [ 5] .debug_info PROGBITS 0000000000000000 0011c0 000482 00 0 0 1 [ 6] .debug_abbrev PROGBITS 0000000000000000 001642 00016d 00 0 0 1 [ 7] .debug_line PROGBITS 0000000000000000 0017af 000246 00 0 0 1 [ 8] .debug_frame PROGBITS 0000000000000000 0019f8 000040 00 0 0 8 [ 9] .debug_str PROGBITS 0000000000000000 001a38 000374 01 MS 0 0 1 [10] .symtab SYMTAB 0000000000000000 001db0 000198 18 11 11 8 [11] .strtab STRTAB 0000000000000000 001f48 000030 00 0 0 1 [12] .shstrtab STRTAB 0000000000000000 001f78 00008a 00 0 0 1 Key to Flags: W (write), A (alloc), X (execute), M (merge), S (strings), I (info), L (link order), O (extra OS processing required), G (group), T (TLS), C (compressed), x (unknown), o (OS specific), E (exclude), l (large), p (processor specific) Elf file type is EXEC (Executable file) Entry point 0x401000 There are 4 program headers, starting at offset 64 Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align LOAD 0x000000 0x0000000000400000 0x0000000000400000 0x000140 0x000140 R 0x1000 LOAD 0x001000 0x0000000000401000 0x0000000000401000 0x00012d 0x00012d R E 0x1000 NOTE 0x000120 0x0000000000400120 0x0000000000400120 0x000020 0x000020 R 0x8 GNU_STACK 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RWE 0x10 Section to Segment mapping: Segment Sections... 00 .note.gnu.property 01 .text 02 .note.gnu.property 03 [hjl@gnu-cfl-1 ld]$ ./tmpdir/pr23428 [hjl@gnu-cfl-1 ld]$ I added a "dummy" .note.gnu.property section in x86 backend so that program header can be in a data PT_LOAD segment. -- H.J.
- Previous message (by thread): RFC: Add SHT_GNU_PHDRS
- Next message (by thread): RFC: Add SHT_GNU_PHDRS
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
More information about the Binutils mailing list