From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/11102 Path: news.gmane.org!.POSTED!not-for-mail From: Paul Sturm Newsgroups: gmane.linux.lib.musl.general Subject: Re: Static PIE with musl and clang Date: Sat, 4 Mar 2017 21:41:24 -0600 (CST) Message-ID: <640524050.2626.1488685284594.JavaMail.zimbra@computervoice.com> References: <1450280459.2314.1488678451062.JavaMail.zimbra@computervoice.com> <20170305024403.GK1520@brightrain.aerifal.cx> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: multipart/alternative; boundary="----=_Part_2625_477381364.1488685284590" X-Trace: blaine.gmane.org 1488685306 10362 195.159.176.226 (5 Mar 2017 03:41:46 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Sun, 5 Mar 2017 03:41:46 +0000 (UTC) To: musl Original-X-From: musl-return-11117-gllmg-musl=m.gmane.org@lists.openwall.com Sun Mar 05 04:41:41 2017 Return-path: Envelope-to: gllmg-musl@m.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by blaine.gmane.org with smtp (Exim 4.84_2) (envelope-from ) id 1ckN3B-0001oB-Gq for gllmg-musl@m.gmane.org; Sun, 05 Mar 2017 04:41:37 +0100 Original-Received: (qmail 26481 invoked by uid 550); 5 Mar 2017 03:41:42 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Original-Received: (qmail 26454 invoked from network); 5 Mar 2017 03:41:41 -0000 X-Virus-Scanned: amavisd-new at server03.computervoice.com In-Reply-To: <20170305024403.GK1520@brightrain.aerifal.cx> X-Mailer: Zimbra 8.6.0_GA_1153 (ZimbraWebClient - FF47 (Linux)/8.6.0_GA_1153) Thread-Topic: Static PIE with musl and clang Thread-Index: bDuR9eqyIXgO0NYo4e4FoMtkl/8xDw== Xref: news.gmane.org gmane.linux.lib.musl.general:11102 Archived-At: ------=_Part_2625_477381364.1488685284590 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit OK. I tried to compile this program: #include 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" To: "musl" 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 ------=_Part_2625_477381364.1488685284590 Content-Type: text/html; charset=utf-8 Content-Transfer-Encoding: quoted-printable
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-dynam= ic-linker

./aslr seg faults w= hen I run it.

<= /div>
readelf -e aslr looks like this:

ELF Header:
Magic: 7f 45 4c 46 0= 2 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's compleme= nt, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
= ABI Version: 0
Type: DYN (Shared object file)
Machine: Advanced Mic= ro Devices X86-64
Version: 0x1
Entry point address: 0x788
Start= of program headers: 64 (bytes into file)
Start of section headers: 658= 4 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
= Size of program headers: 56 (bytes)
Number of program headers: 6
Si= ze of section headers: 64 (bytes)
Number of section headers: 26
Sec= tion header string table index: 23

Section Headers:
[Nr] Name Ty= pe Address Offset
Size EntSize Flags Link Info Align
[ 0] NULL 0000= 000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] = .hash HASH 0000000000000190 00000190
0000000000000058 0000000000000004 = A 2 0 8
[ 2] .dynsym DYNSYM 00000000000001e8 000001e8
0000000000000= 198 0000000000000018 A 3 1 8
[ 3] .dynstr STRTAB 0000000000000380 00000= 380
00000000000000de 0000000000000000 A 0 0 1
[ 4] .rela.dyn RELA 0= 000000000000460 00000460
00000000000000f0 0000000000000018 A 2 0 8
= [ 5] .rela.plt RELA 0000000000000550 00000550
0000000000000048 00000000= 00000018 AI 2 19 8
[ 6] .init PROGBITS 0000000000000598 00000598
00= 0000000000000d 0000000000000000 AX 0 0 1
[ 7] .plt PROGBITS 00000000000= 005b0 000005b0
0000000000000040 0000000000000010 AX 0 0 16
[ 8] .pl= t.got PROGBITS 00000000000005f0 000005f0
0000000000000018 0000000000000= 000 AX 0 0 8
[ 9] .text PROGBITS 0000000000000610 00000610
00000000= 00000497 0000000000000000 AX 0 0 16
[10] .fini PROGBITS 0000000000000aa= 7 00000aa7
0000000000000008 0000000000000000 AX 0 0 1
[11] .rodata = PROGBITS 0000000000000aaf 00000aaf
0000000000000004 0000000000000001 AM= S 0 0 1
[12] .eh_frame_hdr PROGBITS 0000000000000ab4 00000ab4
00000= 0000000001c 0000000000000000 A 0 0 4
[13] .eh_frame PROGBITS 0000000000= 000ad0 00000ad0
0000000000000064 0000000000000000 A 0 0 8
[14] .cto= rs PROGBITS 0000000000200e40 00000e40
0000000000000010 0000000000000000= WA 0 0 8
[15] .dtors PROGBITS 0000000000200e50 00000e50
0000000000= 000010 0000000000000000 WA 0 0 8
[16] .jcr PROGBITS 0000000000200e60 00= 000e60
0000000000000008 0000000000000000 WA 0 0 8
[17] .dynamic DYN= AMIC 0000000000200e68 00000e68
0000000000000150 0000000000000010 WA 3 0= 8
[18] .got PROGBITS 0000000000200fb8 00000fb8
0000000000000048 00= 00000000000008 WA 0 0 8
[19] .got.plt PROGBITS 0000000000201000 0000100= 0
0000000000000030 0000000000000008 WA 0 0 8
[20] .data PROGBITS 00= 00000000201030 00001030
0000000000000008 0000000000000000 WA 0 0 8
= [21] .bss NOBITS 0000000000201040 00001038
0000000000000050 00000000000= 00000 WA 0 0 32
[22] .comment PROGBITS 0000000000000000 00001038
00= 0000000000003c 0000000000000001 MS 0 0 1
[23] .shstrtab STRTAB 00000000= 00000000 000018fb
00000000000000b9 0000000000000000 0 0 1
[24] .sym= tab SYMTAB 0000000000000000 00001078
0000000000000648 0000000000000018 = 25 51 8
[25] .strtab STRTAB 0000000000000000 000016c0
0000000000000= 23b 0000000000000000 0 0 1
Key to Flags:
W (write), A (alloc), X (ex= ecute), M (merge), S (strings), I (info),
L (link order), O (extra OS p= rocessing required), G (group), T (TLS),
C (compressed), x (unknown), o= (OS specific), E (exclude),
l (large), p (processor specific)

P= rogram Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags = Align
LOAD 0x0000000000000000 0x0000000000000000 0x0000000000000000
= 0x0000000000000b34 0x0000000000000b34 R E 200000
LOAD 0x0000000000000e= 40 0x0000000000200e40 0x0000000000200e40
0x00000000000001f8 0x000000000= 0000250 RW 200000
DYNAMIC 0x0000000000000e68 0x0000000000200e68 0x00000= 00000200e68
0x0000000000000150 0x0000000000000150 RW 8
GNU_EH_FRAME= 0x0000000000000ab4 0x0000000000000ab4 0x0000000000000ab4
0x00000000000= 0001c 0x000000000000001c R 4
GNU_STACK 0x0000000000000000 0x00000000000= 00000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 10 GNU_RELRO 0x0000000000000e40 0x0000000000200e40 0x0000000000200e40
0x= 00000000000001c0 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 .cto= rs .dtors .jcr .dynamic .got .got.plt .data .bss
02 .dynamic
03 .= eh_frame_hdr
04
05 .ctors .dtors .jcr .dynamic .got



From: "dalias" &l= t;dalias@libc.org>
To: "musl" <musl@lists.openwall.com><= br>Sent: Sunday, March 5, 2017 2:44:03 AM
Subject: Re: [mu= sl] Static PIE with musl and clang

On Sat, Mar 04, 2017 at 07:47:31PM -0600, Paul Sturm w= rote:
> Has anyone managed to build static PIE with musl and clang,> preferably linking with lld?
>
> I see that this has be= en done using GCC and rcrt1.o, but I cannot
> find a combination of c= ommand 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.
<= br>I doubt lld can do it yet; you need some equivalent of the
--no-dynam= ic-linker option I added to BFD ld. It should be possible
with clang usi= ng 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 (essen= tially doing the same thing you'd do to make an
executable shared librar= y) but there are corner-case things that break
when you try to do it thi= s way. The right approach would be adding
--no-dynamic-linker to lld and= teaching clang to pass it when linking
with -static -pie.

Rich
------=_Part_2625_477381364.1488685284590--