* Static PIE with musl and clang @ 2017-03-05 1:47 Paul Sturm 2017-03-05 2:44 ` Rich Felker 0 siblings, 1 reply; 6+ messages in thread From: Paul Sturm @ 2017-03-05 1:47 UTC (permalink / raw) To: musl [-- Attachment #1: Type: text/plain, Size: 371 bytes --] Has anyone managed to build static PIE with musl and clang, preferably linking with lld? I see that this has been done using GCC and rcrt1.o, but I cannot find a combination of command line parameters that will successfully link and execute with clang. I am using clang 4.0.0RC2 and musl 1.1.16. I have also tried to use binutils ld instead of llvm lld to no avail. [-- Attachment #2: Type: text/html, Size: 653 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Static PIE with musl and clang 2017-03-05 1:47 Static PIE with musl and clang Paul Sturm @ 2017-03-05 2:44 ` Rich Felker 2017-03-05 3:41 ` Paul Sturm 0 siblings, 1 reply; 6+ messages in thread From: Rich Felker @ 2017-03-05 2:44 UTC (permalink / raw) To: musl On Sat, Mar 04, 2017 at 07:47:31PM -0600, Paul Sturm wrote: > Has anyone managed to build static PIE with musl and clang, > preferably linking with lld? > > I see that this has been done using GCC and rcrt1.o, but I cannot > find a combination of command line parameters that will successfully > link and execute with clang. > > I am using clang 4.0.0RC2 and musl 1.1.16. I have also tried to use > binutils ld instead of llvm lld to no avail. I doubt lld can do it yet; you need some equivalent of the --no-dynamic-linker option I added to BFD ld. It should be possible with clang using binutils/BFD ld. You might also be able to hack it by using -shared -Bsymbolic and explicitly linking rcrt1.o on the link command line (essentially doing the same thing you'd do to make an executable shared library) but there are corner-case things that break when you try to do it this way. The right approach would be adding --no-dynamic-linker to lld and teaching clang to pass it when linking with -static -pie. Rich ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Static PIE with musl and clang 2017-03-05 2:44 ` Rich Felker @ 2017-03-05 3:41 ` Paul Sturm 2017-03-05 12:21 ` Szabolcs Nagy 0 siblings, 1 reply; 6+ messages in thread From: Paul Sturm @ 2017-03-05 3:41 UTC (permalink / raw) To: musl [-- Attachment #1: Type: text/plain, Size: 5844 bytes --] OK. I tried to compile this program: #include <stdio.h> int main() { printf("%p\n", main); return 0; } Command line: clang /usr/lib/rcrt1.o ../aslr.c -o aslr -fPIE -shared -Bsymbolic -Wl,--no-dynamic-linker ./aslr seg faults when I run it. readelf -e aslr looks like this: ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x788 Start of program headers: 64 (bytes into file) Start of section headers: 6584 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 6 Size of section headers: 64 (bytes) Number of section headers: 26 Section header string table index: 23 Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .hash HASH 0000000000000190 00000190 0000000000000058 0000000000000004 A 2 0 8 [ 2] .dynsym DYNSYM 00000000000001e8 000001e8 0000000000000198 0000000000000018 A 3 1 8 [ 3] .dynstr STRTAB 0000000000000380 00000380 00000000000000de 0000000000000000 A 0 0 1 [ 4] .rela.dyn RELA 0000000000000460 00000460 00000000000000f0 0000000000000018 A 2 0 8 [ 5] .rela.plt RELA 0000000000000550 00000550 0000000000000048 0000000000000018 AI 2 19 8 [ 6] .init PROGBITS 0000000000000598 00000598 000000000000000d 0000000000000000 AX 0 0 1 [ 7] .plt PROGBITS 00000000000005b0 000005b0 0000000000000040 0000000000000010 AX 0 0 16 [ 8] .plt.got PROGBITS 00000000000005f0 000005f0 0000000000000018 0000000000000000 AX 0 0 8 [ 9] .text PROGBITS 0000000000000610 00000610 0000000000000497 0000000000000000 AX 0 0 16 [10] .fini PROGBITS 0000000000000aa7 00000aa7 0000000000000008 0000000000000000 AX 0 0 1 [11] .rodata PROGBITS 0000000000000aaf 00000aaf 0000000000000004 0000000000000001 AMS 0 0 1 [12] .eh_frame_hdr PROGBITS 0000000000000ab4 00000ab4 000000000000001c 0000000000000000 A 0 0 4 [13] .eh_frame PROGBITS 0000000000000ad0 00000ad0 0000000000000064 0000000000000000 A 0 0 8 [14] .ctors PROGBITS 0000000000200e40 00000e40 0000000000000010 0000000000000000 WA 0 0 8 [15] .dtors PROGBITS 0000000000200e50 00000e50 0000000000000010 0000000000000000 WA 0 0 8 [16] .jcr PROGBITS 0000000000200e60 00000e60 0000000000000008 0000000000000000 WA 0 0 8 [17] .dynamic DYNAMIC 0000000000200e68 00000e68 0000000000000150 0000000000000010 WA 3 0 8 [18] .got PROGBITS 0000000000200fb8 00000fb8 0000000000000048 0000000000000008 WA 0 0 8 [19] .got.plt PROGBITS 0000000000201000 00001000 0000000000000030 0000000000000008 WA 0 0 8 [20] .data PROGBITS 0000000000201030 00001030 0000000000000008 0000000000000000 WA 0 0 8 [21] .bss NOBITS 0000000000201040 00001038 0000000000000050 0000000000000000 WA 0 0 32 [22] .comment PROGBITS 0000000000000000 00001038 000000000000003c 0000000000000001 MS 0 0 1 [23] .shstrtab STRTAB 0000000000000000 000018fb 00000000000000b9 0000000000000000 0 0 1 [24] .symtab SYMTAB 0000000000000000 00001078 0000000000000648 0000000000000018 25 51 8 [25] .strtab STRTAB 0000000000000000 000016c0 000000000000023b 0000000000000000 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) Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flags Align LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000b34 0x0000000000000b34 R E 200000 LOAD 0x0000000000000e40 0x0000000000200e40 0x0000000000200e40 0x00000000000001f8 0x0000000000000250 RW 200000 DYNAMIC 0x0000000000000e68 0x0000000000200e68 0x0000000000200e68 0x0000000000000150 0x0000000000000150 RW 8 GNU_EH_FRAME 0x0000000000000ab4 0x0000000000000ab4 0x0000000000000ab4 0x000000000000001c 0x000000000000001c R 4 GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 10 GNU_RELRO 0x0000000000000e40 0x0000000000200e40 0x0000000000200e40 0x00000000000001c0 0x00000000000001c0 R 1 Section to Segment mapping: Segment Sections... 00 .hash .dynsym .dynstr .rela.dyn .rela.plt .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame 01 .ctors .dtors .jcr .dynamic .got .got.plt .data .bss 02 .dynamic 03 .eh_frame_hdr 04 05 .ctors .dtors .jcr .dynamic .got From: "dalias" <dalias@libc.org> To: "musl" <musl@lists.openwall.com> Sent: Sunday, March 5, 2017 2:44:03 AM Subject: Re: [musl] Static PIE with musl and clang On Sat, Mar 04, 2017 at 07:47:31PM -0600, Paul Sturm wrote: > Has anyone managed to build static PIE with musl and clang, > preferably linking with lld? > > I see that this has been done using GCC and rcrt1.o, but I cannot > find a combination of command line parameters that will successfully > link and execute with clang. > > I am using clang 4.0.0RC2 and musl 1.1.16. I have also tried to use > binutils ld instead of llvm lld to no avail. I doubt lld can do it yet; you need some equivalent of the --no-dynamic-linker option I added to BFD ld. It should be possible with clang using binutils/BFD ld. You might also be able to hack it by using -shared -Bsymbolic and explicitly linking rcrt1.o on the link command line (essentially doing the same thing you'd do to make an executable shared library) but there are corner-case things that break when you try to do it this way. The right approach would be adding --no-dynamic-linker to lld and teaching clang to pass it when linking with -static -pie. Rich [-- Attachment #2: Type: text/html, Size: 6902 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Static PIE with musl and clang 2017-03-05 3:41 ` Paul Sturm @ 2017-03-05 12:21 ` Szabolcs Nagy 2017-05-15 19:24 ` Paul Sturm 0 siblings, 1 reply; 6+ messages in thread From: Szabolcs Nagy @ 2017-03-05 12:21 UTC (permalink / raw) To: musl * Paul Sturm <psturm@computervoice.com> [2017-03-04 21:41:24 -0600]: > clang /usr/lib/rcrt1.o ../aslr.c -o aslr -fPIE -shared -Bsymbolic -Wl,--no-dynamic-linker > > ./aslr seg faults when I run it. you did not static link the libc at all ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Static PIE with musl and clang 2017-03-05 12:21 ` Szabolcs Nagy @ 2017-05-15 19:24 ` Paul Sturm 2017-05-16 9:02 ` Szabolcs Nagy 0 siblings, 1 reply; 6+ messages in thread From: Paul Sturm @ 2017-05-15 19:24 UTC (permalink / raw) To: musl [-- Attachment #1: Type: text/plain, Size: 5779 bytes --] I decided to take a step back and try to make this work first with gcc (7.1) and ld (2.28). Both tools were built statically and musl (1.16+) is also built as a static libc.a. Test program is aslr.c: #include <stdio.h> int main() { printf("%p\n", main); return 0; } gcc aslr.c -fPIE -pie -static-libgcc -Wl,-static -Wl,--no-dynamic-linker ./a.out Segementation fault bash-4.4# readelf -e a.out ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: DYN (Shared object file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x300 Start of program headers: 64 (bytes into file) Start of section headers: 31560 (bytes into file) Flags: 0x0 Size of this header: 64 (bytes) Size of program headers: 56 (bytes) Number of program headers: 6 Size of section headers: 64 (bytes) Number of section headers: 25 Section header string table index: 24 Section Headers: [Nr] Name Type Address Offset Size EntSize Flags Link Info Align [ 0] NULL 0000000000000000 00000000 0000000000000000 0000000000000000 0 0 0 [ 1] .hash HASH 0000000000000190 00000190 0000000000000014 0000000000000004 A 2 0 8 [ 2] .dynsym DYNSYM 00000000000001a8 000001a8 0000000000000030 0000000000000018 A 3 1 8 [ 3] .dynstr STRTAB 00000000000001d8 000001d8 0000000000000007 0000000000000000 A 0 0 1 [ 4] .rela.dyn RELA 00000000000001e0 000001e0 00000000000000c0 0000000000000018 A 2 0 8 [ 5] .init PROGBITS 00000000000002a0 000002a0 000000000000000d 0000000000000000 AX 0 0 1 [ 6] .plt PROGBITS 00000000000002b0 000002b0 0000000000000010 0000000000000010 AX 0 0 16 [ 7] .plt.got PROGBITS 00000000000002c0 000002c0 0000000000000018 0000000000000000 AX 0 0 8 [ 8] .text PROGBITS 00000000000002e0 000002e0 0000000000004f44 0000000000000000 AX 0 0 16 [ 9] .fini PROGBITS 0000000000005224 00005224 0000000000000008 0000000000000000 AX 0 0 1 [10] .rodata PROGBITS 0000000000005240 00005240 0000000000000b90 0000000000000000 A 0 0 32 [11] .eh_frame_hdr PROGBITS 0000000000005dd0 00005dd0 0000000000000024 0000000000000000 A 0 0 4 [12] .eh_frame PROGBITS 0000000000005df8 00005df8 000000000000007c 0000000000000000 A 0 0 8 [13] .ctors PROGBITS 0000000000205e88 00005e88 0000000000000010 0000000000000000 WA 0 0 8 [14] .dtors PROGBITS 0000000000205e98 00005e98 0000000000000010 0000000000000000 WA 0 0 8 [15] .data.rel.ro PROGBITS 0000000000205ea8 00005ea8 0000000000000008 0000000000000000 WA 0 0 8 [16] .dynamic DYNAMIC 0000000000205eb0 00005eb0 0000000000000130 0000000000000010 WA 3 0 8 [17] .got PROGBITS 0000000000205fe0 00005fe0 0000000000000020 0000000000000008 WA 0 0 8 [18] .got.plt PROGBITS 0000000000206000 00006000 0000000000000018 0000000000000008 WA 0 0 8 [19] .data PROGBITS 0000000000206018 00006018 00000000000000f8 0000000000000000 WA 0 0 8 [20] .bss NOBITS 0000000000206120 00006110 00000000000006e0 0000000000000000 WA 0 0 32 [21] .comment PROGBITS 0000000000000000 00006110 000000000000003e 0000000000000001 MS 0 0 1 [22] .symtab SYMTAB 0000000000000000 00006150 00000000000010e0 0000000000000018 23 100 8 [23] .strtab STRTAB 0000000000000000 00007230 000000000000085b 0000000000000000 0 0 1 [24] .shstrtab STRTAB 0000000000000000 00007a8b 00000000000000b7 0000000000000000 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) Program Headers: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flags Align LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000005e74 0x0000000000005e74 R E 0x200000 LOAD 0x0000000000005e88 0x0000000000205e88 0x0000000000205e88 0x0000000000000288 0x0000000000000978 RW 0x200000 DYNAMIC 0x0000000000005eb0 0x0000000000205eb0 0x0000000000205eb0 0x0000000000000130 0x0000000000000130 RW 0x8 GNU_EH_FRAME 0x0000000000005dd0 0x0000000000005dd0 0x0000000000005dd0 0x0000000000000024 0x0000000000000024 R 0x4 GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 0x10 GNU_RELRO 0x0000000000005e88 0x0000000000205e88 0x0000000000205e88 0x0000000000000178 0x0000000000000178 R 0x1 Section to Segment mapping: Segment Sections... 00 .hash .dynsym .dynstr .rela.dyn .init .plt .plt.got .text .fini .rodata .eh_frame_hdr .eh_frame 01 .ctors .dtors .data.rel.ro .dynamic .got .got.plt .data .bss 02 .dynamic 03 .eh_frame_hdr 04 05 .ctors .dtors .data.rel.ro .dynamic .got bash-4.4# bash-4.4# readelf -d a.out Dynamic section at offset 0x5eb0 contains 15 entries: Tag Type Name/Value 0x000000000000000c (INIT) 0x2a0 0x000000000000000d (FINI) 0x5224 0x0000000000000004 (HASH) 0x190 0x0000000000000005 (STRTAB) 0x1d8 0x0000000000000006 (SYMTAB) 0x1a8 0x000000000000000a (STRSZ) 7 (bytes) 0x000000000000000b (SYMENT) 24 (bytes) 0x0000000000000015 (DEBUG) 0x0 0x0000000000000003 (PLTGOT) 0x206000 0x0000000000000007 (RELA) 0x1e0 0x0000000000000008 (RELASZ) 192 (bytes) 0x0000000000000009 (RELAENT) 24 (bytes) 0x000000006ffffffb (FLAGS_1) Flags: PIE 0x000000006ffffff9 (RELACOUNT) 8 0x0000000000000000 (NULL) 0x0 From: "Szabolcs Nagy" <nsz@port70.net> To: "musl" <musl@lists.openwall.com> Sent: Sunday, March 5, 2017 12:21:18 PM Subject: Re: [musl] Static PIE with musl and clang * Paul Sturm <psturm@computervoice.com> [2017-03-04 21:41:24 -0600]: > clang /usr/lib/rcrt1.o ../aslr.c -o aslr -fPIE -shared -Bsymbolic -Wl,--no-dynamic-linker > ). > ./aslr seg faults when I run it. you did not static link the libc at all [-- Attachment #2: Type: text/html, Size: 19053 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: Static PIE with musl and clang 2017-05-15 19:24 ` Paul Sturm @ 2017-05-16 9:02 ` Szabolcs Nagy 0 siblings, 0 replies; 6+ messages in thread From: Szabolcs Nagy @ 2017-05-16 9:02 UTC (permalink / raw) To: musl * Paul Sturm <psturm@computervoice.com> [2017-05-15 14:24:58 -0500]: > I decided to take a step back and try to make this work first with gcc (7.1) and ld (2.28). Both tools were built statically and musl (1.16+) is also built as a static libc.a. > > Test program is aslr.c: > > #include <stdio.h> > > int main() { > printf("%p\n", main); > return 0; > } > > gcc aslr.c -fPIE -pie -static-libgcc -Wl,-static -Wl,--no-dynamic-linker > > ./a.out > Segementation fault there is no -static passed to the compiler so it cannot possibly select the right crt file. you need to patch gcc for static pie support, or pass all the necessary linker flags manually (including the crt files). https://github.com/richfelker/musl-cross-make/blob/master/patches/gcc-6.3.0/0010-static-pie-support.diff ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-05-16 9:02 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-03-05 1:47 Static PIE with musl and clang Paul Sturm 2017-03-05 2:44 ` Rich Felker 2017-03-05 3:41 ` Paul Sturm 2017-03-05 12:21 ` Szabolcs Nagy 2017-05-15 19:24 ` Paul Sturm 2017-05-16 9:02 ` Szabolcs Nagy
Code repositories for project(s) associated with this public inbox https://git.vuxu.org/mirror/musl/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).