Bug#414795: libpthread/NPTL: static linking seems to break raise(3), abort(3)
Package: libc6-dev
Version: 2.3.6.ds1-13
Severity: normal
A program that is statically linked to NPTL will fail at runtime when
calling raise(3) (and, by extension, abort(3)):
$ cc -g -Wall -pthread -I/usr/include/nptl -L/usr/lib/nptl -static
test1.c -o test1
$ strace ./test1
...
tgkill(0, 0, SIGQUIT) = -1 EINVAL (Invalid argument)
This does not occur if the binary is dynamically linked against NPTL,
nor does it occur when linked against LinuxThreads, either statically
or dynamically.
-- Details:
$ cat test.c
#include <signal.h>
int main(int argc, char *argv[]) {
raise(SIGQUIT);
return 0;
}
$ cat Makefile
all: test1 test2 test3 test4
test1: CFLAGS=-g -Wall -pthread -I/usr/include/nptl -L/usr/lib/nptl -static
test2: CFLAGS=-g -Wall -pthread -I/usr/include/nptl -L/usr/lib/nptl
test3: CFLAGS=-g -Wall -pthread -static
test4: CFLAGS=-g -Wall -pthread
test1.c test2.c test3.c test4.c: test.c
cp $^ $@
$ strace ./test1
execve("./test1", ["./test1"], [/* 24 vars */]) = 0
uname({sys="Linux", node="itrains", ...}) = 0
brk(0) = 0x80bf000
brk(0x80bfc90) = 0x80bfc90
set_thread_area({entry_number:-1 -> 6, base_addr:0x80bf830, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
brk(0x80e0c90) = 0x80e0c90
brk(0x80e1000) = 0x80e1000
tgkill(0, 0, SIGQUIT) = -1 EINVAL (Invalid argument)
exit_group(0) = ?
Process 32023 detached
$ strace ./test2
execve("./test2", ["./test2"], [/* 24 vars */]) = 0
uname({sys="Linux", node="itrains", ...}) = 0
brk(0) = 0x804a000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xa7f4a000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=23128, ...}) = 0
mmap2(NULL, 23128, PROT_READ, MAP_PRIVATE, 3, 0) = 0xa7f44000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libpthread.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240H\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=89370, ...}) = 0
mmap2(NULL, 70104, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xa7f32000
mmap2(0xa7f40000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe) = 0xa7f40000
mmap2(0xa7f42000, 4568, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xa7f42000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240O\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=1241392, ...}) = 0
mmap2(NULL, 1247388, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xa7e01000
mmap2(0xa7f28000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x127) = 0xa7f28000
mmap2(0xa7f2f000, 10396, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xa7f2f000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xa7e00000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xa7dff000
mprotect(0xa7f28000, 20480, PROT_READ) = 0
set_thread_area({entry_number:-1 -> 6, base_addr:0xa7dff6c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
munmap(0xa7f44000, 23128) = 0
set_tid_address(0xa7dff708) = 32025
rt_sigaction(SIGRTMIN, {0xa7f364c0, [], SA_SIGINFO}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0xa7f36420, [], SA_RESTART|SA_SIGINFO}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
uname({sys="Linux", node="itrains", ...}) = 0
tgkill(32025, 32025, SIGQUIT) = 0
--- SIGQUIT (Quit) @ 0 (0) ---
+++ killed by SIGQUIT +++
Process 32025 detached
$ strace ./test3
execve("./test3", ["./test3"], [/* 24 vars */]) = 0
uname({sys="Linux", node="itrains", ...}) = 0
brk(0) = 0x80b2000
brk(0x80d3000) = 0x80d3000
getpid() = 32027
kill(32027, SIGQUIT) = 0
--- SIGQUIT (Quit) @ 0 (0) ---
+++ killed by SIGQUIT +++
Process 32027 detached
$ strace ./test4
execve("./test4", ["./test4"], [/* 24 vars */]) = 0
uname({sys="Linux", node="itrains", ...}) = 0
brk(0) = 0x804a000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xa7fbc000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=23128, ...}) = 0
mmap2(NULL, 23128, PROT_READ, MAP_PRIVATE, 3, 0) = 0xa7fb6000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libpthread.so.0", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240H\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=89370, ...}) = 0
mmap2(NULL, 70104, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xa7fa4000
mmap2(0xa7fb2000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0xe) = 0xa7fb2000
mmap2(0xa7fb4000, 4568, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xa7fb4000
close(3) = 0
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
open("/lib/tls/i686/cmov/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\240O\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=1241392, ...}) = 0
mmap2(NULL, 1247388, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xa7e73000
mmap2(0xa7f9a000, 28672, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x127) = 0xa7f9a000
mmap2(0xa7fa1000, 10396, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xa7fa1000
close(3) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xa7e72000
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xa7e71000
mprotect(0xa7f9a000, 20480, PROT_READ) = 0
set_thread_area({entry_number:-1 -> 6, base_addr:0xa7e716c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
munmap(0xa7fb6000, 23128) = 0
set_tid_address(0xa7e71708) = 32029
rt_sigaction(SIGRTMIN, {0xa7fa84c0, [], SA_SIGINFO}, NULL, 8) = 0
rt_sigaction(SIGRT_1, {0xa7fa8420, [], SA_RESTART|SA_SIGINFO}, NULL, 8) = 0
rt_sigprocmask(SIG_UNBLOCK, [RTMIN RT_1], NULL, 8) = 0
getrlimit(RLIMIT_STACK, {rlim_cur=8192*1024, rlim_max=RLIM_INFINITY}) = 0
uname({sys="Linux", node="itrains", ...}) = 0
tgkill(32029, 32029, SIGQUIT) = 0
--- SIGQUIT (Quit) @ 0 (0) ---
+++ killed by SIGQUIT +++
Process 32029 detached
-- System Information:
Debian Release: 4.0
APT prefers testing
APT policy: (999, 'testing')
Architecture: i386 (i686)
Shell: /bin/sh linked to /bin/bash
Kernel: Linux 2.6.16-2-686
Locale: LANG=C, LC_CTYPE=C (charmap=ANSI_X3.4-1968)
Versions of packages libc6-dev depends on:
ii libc6 2.3.6.ds1-13 GNU C Library: Shared libraries
ii linux-kernel-headers 2.6.18-6 Linux Kernel Headers for developme
Versions of packages libc6-dev recommends:
ii gcc [c-compiler] 4:4.1.1-15 The GNU C compiler
ii gcc-2.95 [c-compiler] 1:2.95.4-27 The GNU C compiler
ii gcc-3.3 [c-compiler] 1:3.3.6-15 The GNU C compiler
ii gcc-4.1 [c-compiler] 4.1.1-21 The GNU C compiler
-- no debconf information
Reply to: