Bug#819762: clang: -shared-libasan is unusable

Ben Longbons brlongbons at gmail.com
Fri Apr 1 22:58:38 UTC 2016


Package: clang
Version: 1:3.6-33
Severity: normal

Dear Maintainer,

With the latest available versions of clang-3.{5..9}
( 1:3.5.2-3 1:3.6.2-3 1:3.7.1-2 1:3.8-2 1:3.9~svn262954-1 )
it is impossible to build and run programs using the shared version
of libasan.

For 3.5 through 3.7, the error is at link time:

/usr/bin/x86_64-linux-gnu-ld.bfd.real: cannot find /usr/lib/llvm-3.5/bin/../lib/clang/3.5.2/lib/linux/libclang_rt.asan-preinit-x86_64.a: No such file or directory
/usr/bin/x86_64-linux-gnu-ld.bfd.real: cannot find /usr/lib/llvm-3.5/bin/../lib/clang/3.5.2/lib/linux/libclang_rt.asan-x86_64.so: No such file or directory

The debian packaging appears to simply not include the shared versions
of the files. Since these are older versions, it may not be worth fixing.

For 3.8 and 3.9, the error is at load time:

libclang_rt.asan-x86_64.so => not found

exporting LD_LIBRARY_PATH works, but is not .

Among other things, this makes it impossible to use ASAN with shared
libraries, though there are reasons to want shared ASAN for binaries too.

Additionally, `-print-file-name=libasan.so` should do the right thing
like it does for GCC, to avoid both clang-specific behavior *and* trying
to guess the right architecture for the current set of CC and CFLAGS.

Particularly, for shared libraries, it is expected that you can do:
LD_PRELOAD=$(${CC} ${CFLAGS} -print-file-name=libasan.so):$LD_PRELOAD

# BEGIN TEST SCRIPT
#!/bin/bash

# ASAN is available since CLANG 3.1 and since GCC 4.8
# To test with a single version, do something like:
# LD_LIBRARY_PATH=/usr/lib/llvm-3.8/lib/clang/3.8.0/lib/linux/ CC=clang-3.8 ./test.sh

ALL_VERSIONS=$(echo gcc-4.{8..9} gcc-{5..6} clang-3.{1..9})

for CC in ${CC:-${ALL_VERSIONS}}
do
    CFLAGS=-fsanitize=address
    if [ "${CC}" != "${CC#clang}" ]
    then
        CFLAGS="$CFLAGS -shared-libasan"
    fi
    if ! ${CC} --version &> /dev/null
    then
        echo ${CC} is not installed.
        continue
    fi
    if ! echo 'int main(){}' | ${CC} ${CFLAGS} -x c - &> /dev/null
    then
        echo ${CC} failed to compile/link the program.
        continue
    fi
    if ldd a.out | grep -q 'not found'
    then
        echo ${CC} failed to create a loadable binary.
        continue
    fi
    ACTUAL_ASAN=$(ldd a.out | grep asan | sed 's/.*=> *//;s/ *(.*) *//')
    if ! DECLARED_ASAN=$(${CC} ${CFLAGS} -print-file-name=libasan.so 2>/dev/null)
    then
        echo ${CC} failed to print filename.
        continue
    fi
    if [ "$(realpath ${ACTUAL_ASAN})" != "$(realpath ${DECLARED_ASAN})" ]
    then
        echo ${CC} printed a different version than it actually used.
        continue
    fi
    echo ${CC} is okay!
done
# END TEST SCRIPT

-- System Information:
Debian Release: stretch/sid
  APT prefers testing
  APT policy: (600, 'testing'), (500, 'unstable-debug'), (500, 'unstable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.3.0-1-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Versions of packages clang depends on:
ii  clang-3.6  1:3.6.2-3

clang recommends no packages.

clang suggests no packages.

-- no debconf information



More information about the Pkg-llvm-team mailing list