[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: