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

Bug#714294: libc6: applications linked with proprietary nvidia modules get SEGV because tls version of library is not found



Package: libc6
Version: 2.17-3
Severity: normal

Dear Maintainer,

I am seeing SEGV at a startup for _all_ applications which are linked
to libGL served by a proprietary NVIDIA driver. At first I thought this
was the NVIDIA issue but then it turned out that the issue is caused by
linker (or at least this is my understanding now).

NVIDIA installer provides two versions of nvidia-tls library:
$ file /usr/lib/libnvidia-tls.so.310.44
/usr/lib/libnvidia-tls.so.310.44: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, for GNU/Linux 2.2.5, stripped
$ file /usr/lib/tls/libnvidia-tls.so.310.44
/usr/lib/tls/libnvidia-tls.so.310.44: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, for GNU/Linux 2.3.99, stripped

I would have expected that /usr/lib/tls variant would be picked up
automagically.
$ /sbin/ldconfig -p | grep tls
        libnvidia-tls.so.310.44 (libc6, hwcap: 0x8000000000000000, ABI OS: Linux 2.3.99) => /usr/lib/tls/libnvidia-tls.so.310.44
        libnvidia-tls.so.310.44 (libc6, ABI OS: Linux 2.2.5) => /usr/lib/libnvidia-tls.so.310.44

and
$ /sbin/ldconfig -v | grep -v ^$'\t' 2>/dev/null
/lib/i386-linux-gnu:
/usr/lib/i386-linux-gnu:
/usr/local/lib:
/lib:
/usr/lib:
/sbin/ldconfig: Informace o /usr/lib/libfakeroot-0.so nelze zĂ­skat: AdresĂĄĹ? nebo soubor neexistuje
/lib/i386-linux-gnu/i686: (hwcap: 0x0008000000000000)
/usr/lib/i386-linux-gnu/i586: (hwcap: 0x0004000000000000)
/usr/lib/i386-linux-gnu/sse2: (hwcap: 0x0000000004000000)
/usr/lib/i386-linux-gnu/i686: (hwcap: 0x0008000000000000)
/usr/lib/i586: (hwcap: 0x0004000000000000)
/usr/lib/sse2: (hwcap: 0x0000000004000000)
/usr/lib/i686: (hwcap: 0x0008000000000000)
/usr/lib/i486: (hwcap: 0x0002000000000000)
/usr/lib/tls: (hwcap: 0x8000000000000000)
/lib/i386-linux-gnu/i686/cmov: (hwcap: 0x0008000000008000)
/usr/lib/i386-linux-gnu/i686/cmov: (hwcap: 0x0008000000008000)
/usr/lib/i386-linux-gnu/i686/sse2: (hwcap: 0x0008000004000000)
/usr/lib/i686/cmov: (hwcap: 0x0008000000008000)

suggest that /usr/lib/tls should be honored. For some reason it is not
though.

$ cat ./main.c 
#include <stdio.h>
int main(int argc, char **argv)
{
        printf("Yep\n");
        return 0;
}

$ gcc -o main main.c /usr/lib/libGL.so.1
$ ldd ./main
        linux-gate.so.1 =>  (0xb77cc000)
        libGL.so.1 => /usr/lib/libGL.so.1 (0xb76d2000)
        libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7589000)
        libnvidia-tls.so.310.44 => /usr/lib/libnvidia-tls.so.310.44 (0xb7584000)
        libnvidia-glcore.so.310.44 => /usr/lib/libnvidia-glcore.so.310.44 (0xb5862000)
        libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0xb572a000)
        libXext.so.6 => /usr/lib/i386-linux-gnu/libXext.so.6 (0xb5718000)
        libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb5714000)
        /lib/ld-linux.so.2 (0xb77cd000)
        libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb56ed000)
        libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb56ca000)
        libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0xb56c7000)
        libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6 (0xb56c1000)

$ LD_DEBUG=libs ./main
     15977:     find library=libGL.so.1 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/usr/lib/libGL.so.1
     15977:
     15977:     find library=libc.so.6 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/lib/i386-linux-gnu/libc.so.6
     15977:
     15977:     find library=libnvidia-tls.so.310.44 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/usr/lib/libnvidia-tls.so.310.44
     15977:
     15977:     find library=libnvidia-glcore.so.310.44 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/usr/lib/libnvidia-glcore.so.310.44
     15977:
     15977:     find library=libX11.so.6 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/usr/lib/i386-linux-gnu/libX11.so.6
     15977:
     15977:     find library=libXext.so.6 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/usr/lib/i386-linux-gnu/libXext.so.6
     15977:
     15977:     find library=libdl.so.2 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/lib/i386-linux-gnu/libdl.so.2
     15977:
     15977:     find library=libm.so.6 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/lib/i386-linux-gnu/libm.so.6
     15977:
     15977:     find library=libxcb.so.1 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/usr/lib/i386-linux-gnu/libxcb.so.1
     15977:
     15977:     find library=libXau.so.6 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/usr/lib/i386-linux-gnu/libXau.so.6
     15977:
     15977:     find library=libXdmcp.so.6 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/usr/lib/i386-linux-gnu/libXdmcp.so.6
     15977:
     15977:
     15977:     calling init: /lib/i386-linux-gnu/libc.so.6
     15977:
     15977:
     15977:     calling init: /usr/lib/i386-linux-gnu/libXdmcp.so.6
     15977:
     15977:
     15977:     calling init: /usr/lib/i386-linux-gnu/libXau.so.6
     15977:
     15977:
     15977:     calling init: /usr/lib/i386-linux-gnu/libxcb.so.1
     15977:
     15977:
     15977:     calling init: /lib/i386-linux-gnu/libm.so.6
     15977:
     15977:
     15977:     calling init: /lib/i386-linux-gnu/libdl.so.2
     15977:
     15977:
     15977:     calling init: /usr/lib/i386-linux-gnu/libX11.so.6
     15977:
     15977:
     15977:     calling init: /usr/lib/i386-linux-gnu/libXext.so.6
     15977:
     15977:
     15977:     calling init: /usr/lib/libnvidia-glcore.so.310.44
     15977:
     15977:
     15977:     calling init: /usr/lib/libGL.so.1
     15977:
     15977:     /usr/lib/libGL.so.1: error: symbol lookup error: undefined symbol: pthread_create, version GLIBC_2.0 (fatal)
     15977:     find library=libselinux.so.1 [0]; searching
     15977:      search cache=/etc/ld.so.cache
     15977:       trying file=/lib/i386-linux-gnu/libselinux.so.1
     15977:
     15977:
     15977:     calling init: /lib/i386-linux-gnu/libselinux.so.1
     15977:
     15977:
     15977:     calling fini: /lib/i386-linux-gnu/libselinux.so.1 [0]
     15977:
SEGV

$ LD_LIBRARY_PATH=/usr/lib/tls:/usr/lib  ./main
Yep

Is this a misconfiguration on my end or the glibc doesn't honor tls/
directory?

-- System Information:
Debian Release: 7.0
  APT prefers testing
  APT policy: (500, 'testing'), (500, 'stable')
Architecture: i386 (i686)

Kernel: Linux 3.2.0-4-686-pae (SMP w/2 CPU cores)
Locale: LANG=cs_CZ.UTF-8, LC_CTYPE=cs_CZ.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash

Versions of packages libc6 depends on:
ii  libgcc1  1:4.7.2-5

Versions of packages libc6 recommends:
ii  libc6-i686  2.17-3

Versions of packages libc6 suggests:
ii  debconf [debconf-2.0]  1.5.49
pn  glibc-doc              <none>
ii  locales                2.17-3

-- Configuration Files:
/etc/ld.so.conf.d/i486-linux-gnu.conf changed:
/lib/i386-linux-gnu
/usr/lib/i386-linux-gnu


-- debconf information:
* glibc/upgrade: true
* glibc/disable-screensaver:
  glibc/restart-failed:
* glibc/restart-services: vsftpd cron atd
* libraries/restart-without-asking: false


Reply to: