|
Message-ID: <4426D448C41DED43A39522E6E2C3A13CBC6EE0@QLDC01>
Date: Tue, 21 Jul 2015 01:23:38 +0000
From: Warren Armstrong <WA@...ntessencelabs.com>
To: "musl@...ts.openwall.com" <musl@...ts.openwall.com>
Subject: Segfault in VDSO symbol resolution
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
Dynamic linkage of the test program:
ldd ./shell
linux-vdso.so.1 => (0x00007fffc6f3d000)
libc.so => /usr/local/debug-musl/lib/libc.so (0x00007fad75dc2000)
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]
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
Content of type "text/html" skipped
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.