mailing list of musl libc
 help / color / mirror / code / Atom feed
* 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).