2 * We target -pie -z combreloc.
3 * We pack everything in one segment, then we don't optimize on boundaries
4 * related to the various system page sizes.
6 /* default, big, little */
7 OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
8 OUTPUT_ARCH(i386:x86-64)
10 /* Table of segments. They can overlay themselves depending on their content. */
13 headers_seg PT_PHDR PHDRS;
15 dynamic_seg PT_DYNAMIC;
16 rwe_seg PT_LOAD FILEHDR PHDRS FLAGS(7);
21 .interp : { *(.interp) } : interp_seg : rwe_seg
22 .hash : { *(.hash) } : rwe_seg
23 .gnu.hash : { *(.gnu.hash) } : rwe_seg
24 .dynsym : { *(.dynsym) } : rwe_seg
25 .dynstr : { *(.dynstr) } : rwe_seg
26 .gnu.version : { *(.gnu.version) } : rwe_seg
27 .gnu.version_r : { *(.gnu.version_r) } : rwe_seg
28 .gnu.version_d : { *(.gnu.version_d) } : rwe_seg
32 *(.rela.text .rela.text.*)
34 *(.rela.rodata .rela.rodata.*)
35 *(.rela.data .rela.data.*)
39 *(.rela.bss .rela.bss.*)
42 .rela.plt : { *(.rela.plt) } : rwe_seg
43 /* "command line order" concatened glibc crti.S and crtn.S (prolog) with the "magic" function _init which will make the linker pick it for DT_INIT */
44 .init : { KEEP (*(SORT_NONE(.init))) } : rwe_seg
45 .plt : { *(.plt) } : rwe_seg
46 .plt.got : { *(.plt.got) } : rwe_seg
47 .text : { *(.text) } : rwe_seg
48 /* "command line order" concatened glibc crti.S and crtn.S (prolog) with the "magic" function _fini which will make the linker pick it for DT_FINI */
49 .fini : { KEEP (*(SORT_NONE(.fini))) } : rwe_seg
52 /* we don't have any, but those "magic" symbols are required by glibc csu */
53 PROVIDE_HIDDEN (__init_array_start = .);
54 PROVIDE_HIDDEN (__init_array_end = .); /* see above */
56 .dynamic : { *(.dynamic) } : dynamic_seg : rwe_seg
57 .got : { *(.got) } : rwe_seg
58 .got.plt : { *(.got.plt) } : rwe_seg
59 .data : { *(.data) } : rwe_seg
60 .rodata : { *(.rodata .rodata.*) } : rwe_seg
61 .bss : { *(.dynbss) *(.bss) } : rwe_seg
62 /DISCARD/ : { *(.note.GNU-stack) *(.eh_frame*) *(.note.ABI-tag) }