|
Message-ID: <4426D448C41DED43A39522E6E2C3A13CBC6FA5@QLDC01> Date: Tue, 21 Jul 2015 04:50:50 +0000 From: Warren Armstrong <WA@...ntessencelabs.com> To: "musl@...ts.openwall.com" <musl@...ts.openwall.com> Subject: RE: Segfault in VDSO symbol resolution Thanks for the answer - I did not see before that there's a 'musl-gcc'. If I use that, then the dynamic linker is set correctly and the application works as expected. -----Original Message----- From: Рысь [mailto:lynx@...server.ru] Sent: Tuesday, 21 July 2015 2:19 PM To: musl@...ts.openwall.com Subject: Re: [musl] Segfault in VDSO symbol resolution On Tue, 21 Jul 2015 01:23:38 +0000 Warren Armstrong <WA@...ntessencelabs.com> wrote: > Hi, > > I've been trying to compile the latest version of OpenSSL against > musl. The compilation succeeds after some manual tweaking of config > files but the test suite fails. I have managed to reproduce the > failure using a small C program and traced the problem to a segfault > in __vdsosym, but I've reached the limits of my knowledge and hope > someone on the list can help me. Details of my setup are below. > > Cheers, > Warren > > System: > uname -a: Linux QLBuild01 3.16.0-qre #5 SMP Wed Jun 17 15:02:01 > AEST 2015 x86_64 x86_64 x86_64 GNU/Linux (Note: This kernel name is > non-standard but it is a stock 3.16.0 kernel) /etc/issue: Ubuntu > 14.04.1 LTS gcc version: gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 > > Musl version: > Git checkout yesterday from: > git remote show origin > * remote origin > Fetch URL: git://git.musl-libc.org/musl > Push URL: git://git.musl-libc.org/musl > HEAD branch: master > Remote branches: > master tracked > rs-1.0 tracked > Local branch configured for 'git pull': > master merges with remote master > Local ref configured for 'git push': > master pushes to master (up to date) Most recent commit: > 0f9c2666aca95eb98eb0ef4f4d8d1473c8ce3fa0 > > Musl configuration: > CFLAGS="-O0" ./configure --prefix=/usr/local/debug-musl > --enable-debug (The problem first arose with a standard configuration > specifying only --prefix - I have changed the configuration to make > GDB useful and the problem persists) > > The test program (shell.c): > #include <time.h> > > int main() > { > time(NULL); > return 0; > } > > Test program compilation: > gcc -nostdlib -L /usr/local/debug-musl/lib/ -isystem > /usr/local/debug-musl/include/ -o shell shell.c > /usr/local/debug-musl/lib/crt1.o /usr/local/debug-musl/lib/crti.o -lc > -lgcc > The gcc command line probably misses -Wl,-dynamic-linker -Wl,/path/to/musl.ld.so part > Dynamic linkage of the test program: > ldd ./shell > linux-vdso.so.1 => (0x00007fffc6f3d000) > libc.so => /usr/local/debug-musl/lib/libc.so > (0x00007fad75dc2000) Testing binary with glibc ldd makes no sense, > > Gdb output: > gdb ./shell > <startup blurb removed> > Reading symbols from ./shell...done. > (gdb) run > Starting program: /home/warmstrong/shell > > Program received signal SIGSEGV, Segmentation fault. > 0x00007ffff7b37726 in __vdsosym (vername=0x7ffff7bd496b "LINUX_2.6", > name=0x7ffff7bd4956 "__vdso_clock_gettime") at src/internal/vdso.c:45 > 45 for (i=0; libc.auxv[i] != AT_SYSINFO_EHDR; i+=2) > (gdb) bt #0 0x00007ffff7b37726 in __vdsosym (vername=0x7ffff7bd496b > "LINUX_2.6", name=0x7ffff7bd4956 "__vdso_clock_gettime") at > src/internal/vdso.c:45 #1 0x00007ffff7b9ec6e in __clock_gettime > (clk=0, ts=0x7fffffffe5b0) at src/time/clock_gettime.c:31 #2 > 0x00007ffff7ba081d in time (t=0x0) at src/time/time.c:9 #3 > 0x00000000004003ee in main () (gdb) frame 0 #0 0x00007ffff7b37726 in > __vdsosym (vername=0x7ffff7bd496b "LINUX_2.6", name=0x7ffff7bd4956 > "__vdso_clock_gettime") at src/internal/vdso.c:45 45 for > (i=0; libc.auxv[i] != AT_SYSINFO_EHDR; i+=2) (gdb) info locals i = 0 > eh = 0x0 ph = 0x7fffffffe610 dynv = 0x0 base = 1 strings = > 0x7ffff7de9557 "H\211\305d\213\004%\030" > syms = 0x7fffffffe5d0 > hashtab = 0x0 > versym = 0x0 > verdef = 0x7fffffffe620 > (gdb) print libc.auxv > No symbol "libc" in current context. > > Readelf output: > $: readelf -d shell > Dynamic section at offset 0xed0 contains 14 entries: > Tag Type Name/Value > 0x0000000000000001 (NEEDED) Shared library: [libc.so] > 0x000000000000000c (INIT) 0x4003a0 > 0x000000000000000d (FINI) 0x40041f > 0x000000006ffffef5 (GNU_HASH) 0x400278 > 0x0000000000000005 (STRTAB) 0x400338 > 0x0000000000000006 (SYMTAB) 0x4002a8 > 0x000000000000000a (STRSZ) 56 (bytes) > 0x000000000000000b (SYMENT) 24 (bytes) > 0x0000000000000015 (DEBUG) 0x0 > 0x0000000000000003 (PLTGOT) 0x601000 > 0x0000000000000002 (PLTRELSZ) 48 (bytes) > 0x0000000000000014 (PLTREL) RELA > 0x0000000000000017 (JMPREL) 0x400370 > 0x0000000000000000 (NULL) 0x0 > > $ readelf -l shell > > Elf file type is EXEC (Executable file) Entry point 0x4003f5 There are > 9 program headers, starting at offset 64 > > Program Headers: > Type Offset VirtAddr PhysAddr > FileSiz MemSiz Flags Align > PHDR 0x0000000000000040 0x0000000000400040 > 0x0000000000400040 0x00000000000001f8 0x00000000000001f8 R E 8 > INTERP 0x0000000000000238 0x0000000000400238 > 0x0000000000400238 0x000000000000001c 0x000000000000001c R 1 > [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2] If your system is glibc based then why your produced binary calls glibc dynamic linker? It should call musl one (symlink to libc.so). > LOAD 0x0000000000000000 0x0000000000400000 > 0x0000000000400000 0x00000000000004a0 0x00000000000004a0 R E > 200000 LOAD 0x0000000000000ed0 0x0000000000600ed0 > 0x0000000000600ed0 0x0000000000000158 0x0000000000000158 RW > 200000 DYNAMIC 0x0000000000000ed0 0x0000000000600ed0 > 0x0000000000600ed0 0x0000000000000130 0x0000000000000130 RW 8 > NOTE 0x0000000000000254 0x0000000000400254 > 0x0000000000400254 0x0000000000000024 0x0000000000000024 R 4 > GNU_EH_FRAME 0x0000000000000420 0x0000000000400420 > 0x0000000000400420 0x000000000000001c 0x000000000000001c R 4 > GNU_STACK 0x0000000000000000 0x0000000000000000 > 0x0000000000000000 0x0000000000000000 0x0000000000000000 RW 10 > GNU_RELRO 0x0000000000000ed0 0x0000000000600ed0 > 0x0000000000600ed0 0x0000000000000130 0x0000000000000130 R 1 > > Section to Segment mapping: > Segment Sections... > 00 > 01 .interp > 02 .interp .note.gnu.build-id .gnu.hash .dynsym .dynstr .rela.plt .init .plt .text .fini .eh_frame_hdr .eh_frame > 03 .dynamic .got.plt > 04 .dynamic > 05 .note.gnu.build-id > 06 .eh_frame_hdr > 07 > 08 .dynamic > > $ readelf --dyn-syms shell > > Symbol table '.dynsym' contains 6 entries: > Num: Value Size Type Bind Vis Ndx Name > 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND > 1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND time > 2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND > __libc_start_main 3: 0000000000601028 0 NOTYPE GLOBAL DEFAULT > 14 _edata 4: 0000000000601028 0 NOTYPE GLOBAL DEFAULT 14 _end > 5: 0000000000601028 0 NOTYPE GLOBAL DEFAULT 14 __bss_start
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.