[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Libtool and ASAN
From: |
Akim Demaille |
Subject: |
Libtool and ASAN |
Date: |
Mon, 28 Apr 2014 17:45:38 +0200 |
Hi friends,
I'm trying to use -fsanitize=address on OS X using MacPorts' Clang++ 3.5.
The project consists of C++ libraries, on top of which is built a Python
module (with a thin C++ layer which needs to be compiled). Libtool
(2.4.2 - the name of a fine belgian band of electronic music btw)
is used in all layers.
To enable ASAN, I add '-fsanitize=address' to my CXXFLAGS. It works well
except for the C++ part of the Python module:
> address@hidden ~/src/lrde/vaucanson2 $ make -C _build/35d python/vcsn_cxx.la
> V=1
> /bin/sh ./libtool --tag=CXX --mode=link ccache clang++-mp-3.5 -Wall
> -Wextra -Wcast-align -Wcast-qual -Wdocumentation -Wformat
> -Wmissing-declarations -Wno-parentheses -Woverloaded-virtual -Wpointer-arith
> -Wwrite-strings -Qunused-arguments -ggdb -fsanitize=address -std=c++11
> -avoid-version -module -L/opt/local/lib -Wl,-rpath,/opt/local/lib
> -L/opt/local/lib -o python/vcsn_cxx.la -rpath
> /opt/gostai/lib/python2.7/site-packages python/python_vcsn_cxx_la-vcsn_cxx.lo
> -lboost_python-mt lib/liblal_char_b.la lib/liblal_char_br.la
> lib/liblal_char_q.la lib/liblal_char_r.la lib/liblal_char_z.la
> lib/liblal_char_zr.la lib/liblal_char_zrr.la lib/liblan_char_b.la
> lib/liblan_char_r.la lib/liblan_char_z.la lib/liblan_char_zr.la
> lib/liblao_br.la lib/liblao_z.la lib/liblaw_char_b.la lib/liblaw_char_br.la
> lib/liblaw_char_r.la lib/liblaw_char_z.la lib/liblaw_char_zr.la
> lib/liblaw_char_zrr.la lib/libvcsn.la
> libtool: link: rm -fr python/.libs/vcsn_cxx.la python/.libs/vcsn_cxx.lai
> python/.libs/vcsn_cxx.so
> libtool: link: ccache clang++-mp-3.5 -Wl,-undefined -Wl,dynamic_lookup -o
> python/.libs/vcsn_cxx.so -bundle python/.libs/python_vcsn_cxx_la-vcsn_cxx.o
> -L/opt/local/lib -lboost_python-mt lib/.libs/liblal_char_b.dylib
> lib/.libs/liblal_char_br.dylib lib/.libs/liblal_char_q.dylib
> lib/.libs/liblal_char_r.dylib lib/.libs/liblal_char_z.dylib
> lib/.libs/liblal_char_zr.dylib lib/.libs/liblal_char_zrr.dylib
> lib/.libs/liblan_char_b.dylib lib/.libs/liblan_char_r.dylib
> lib/.libs/liblan_char_z.dylib lib/.libs/liblan_char_zr.dylib
> lib/.libs/liblao_br.dylib lib/.libs/liblao_z.dylib
> lib/.libs/liblaw_char_b.dylib lib/.libs/liblaw_char_br.dylib
> lib/.libs/liblaw_char_r.dylib lib/.libs/liblaw_char_z.dylib
> lib/.libs/liblaw_char_zr.dylib lib/.libs/liblaw_char_zrr.dylib
> lib/.libs/libvcsn.dylib -lboost_filesystem-mt -lboost_system-mt -lltdl
> -Wl,-rpath -Wl,/opt/local/lib
> libtool: link: ( cd "python/.libs" && rm -f "vcsn_cxx.la" && ln -s
> "../vcsn_cxx.la" "vcsn_cxx.la" )
What matters here is that -fsanitize=address is dropped, it is
not passed to the linker. And I really need it:
> address@hidden ~/src/lrde/vaucanson2 $ ./_build/35d/tests/bin/vcsn -e python
> -c 'import vcsn'
> Traceback (most recent call last):
> File "<string>", line 1, in <module>
> File "/Users/akim/src/lrde/vaucanson2/python/vcsn/__init__.py", line 4, in
> <module>
> from vcsn_cxx import *
> ImportError:
> dlopen(/Users/akim/src/lrde/vaucanson2/_build/35d/python/.libs/vcsn_cxx.so,
> 2): Symbol not found: ___asan_option_detect_stack_use_after_return
> Referenced from:
> /Users/akim/src/lrde/vaucanson2/_build/35d/lib/.libs/liblal_char_b.0.dylib
> Expected in: flat namespace
> in /Users/akim/src/lrde/vaucanson2/_build/35d/lib/.libs/liblal_char_b.0.dylib
I have to use -Wc to force Libtool to pass it to the compiler used
to link (I must not use -Wl, because then it is passed to the linker
invoked by the compiler, and the linker rejects -fsanitize).
> address@hidden ~/src/lrde/vaucanson2/_build/35d $ /bin/sh ./libtool
> --tag=CXX --mode=link ccache clang++-mp-3.5 -Wall -Wextra -Wcast-align
> -Wcast-qual -Wdocumentation -Wformat -Wmissing-declarations -Wno-parentheses
> -Woverloaded-virtual -Wpointer-arith -Wwrite-strings -Qunused-arguments
> -ggdb -Wc,-fsanitize=address -std=c++11 -avoid-version -module
> -L/opt/local/lib -Wl,-rpath,/opt/local/lib -L/opt/local/lib -o
> python/vcsn_cxx.la -rpath /opt/gostai/lib/python2.7/site-packages
> python/python_vcsn_cxx_la-vcsn_cxx.lo -lboost_python-mt lib/liblal_char_b.la
> lib/liblal_char_br.la lib/liblal_char_q.la lib/liblal_char_r.la
> lib/liblal_char_z.la lib/liblal_char_zr.la lib/liblal_char_zrr.la
> lib/liblan_char_b.la lib/liblan_char_r.la lib/liblan_char_z.la
> lib/liblan_char_zr.la lib/liblao_br.la lib/liblao_z.la lib/liblaw_char_b.la
> lib/liblaw_char_br.la lib/liblaw_char_r.la lib/liblaw_char_z.la
> lib/liblaw_char_zr.la lib/liblaw_char_zrr.la lib/libvcsn.la
> libtool: link: rm -fr python/.libs/vcsn_cxx.so.ld_QwmwqO
> libtool: link: ccache clang++-mp-3.5 -Wl,-undefined -Wl,dynamic_lookup -o
> python/.libs/vcsn_cxx.so -bundle python/.libs/python_vcsn_cxx_la-vcsn_cxx.o
> -L/opt/local/lib -lboost_python-mt lib/.libs/liblal_char_b.dylib
> lib/.libs/liblal_char_br.dylib lib/.libs/liblal_char_q.dylib
> lib/.libs/liblal_char_r.dylib lib/.libs/liblal_char_z.dylib
> lib/.libs/liblal_char_zr.dylib lib/.libs/liblal_char_zrr.dylib
> lib/.libs/liblan_char_b.dylib lib/.libs/liblan_char_r.dylib
> lib/.libs/liblan_char_z.dylib lib/.libs/liblan_char_zr.dylib
> lib/.libs/liblao_br.dylib lib/.libs/liblao_z.dylib
> lib/.libs/liblaw_char_b.dylib lib/.libs/liblaw_char_br.dylib
> lib/.libs/liblaw_char_r.dylib lib/.libs/liblaw_char_z.dylib
> lib/.libs/liblaw_char_zr.dylib lib/.libs/liblaw_char_zrr.dylib
> lib/.libs/libvcsn.dylib -lboost_filesystem-mt -lboost_system-mt -lltdl
> -fsanitize=address -Wl,-rpath -Wl,/opt/local/lib
> libtool: link: ( cd "python/.libs" && rm -f "vcsn_cxx.la" && ln -s
> "../vcsn_cxx.la" "vcsn_cxx.la" )
This vcsn_cxx module is declared to Automake like this:
pyexec_LTLIBRARIES = %D%/vcsn_cxx.la
%C%_vcsn_cxx_la_CPPFLAGS = $(AM_CPPFLAGS) $(BOOST_PYTHON_CPPFLAGS)
%C%_vcsn_cxx_la_LDFLAGS = -avoid-version -module $(BOOST_PYTHON_LDFLAGS)
%C%_vcsn_cxx_la_LIBADD = $(BOOST_PYTHON_LIBS) $(all_libctx) lib/libvcsn.la
My other libraries, which are not modules, are linked properly though.
For instance (the only relevant part is that -fsanitize is not stripped
from the command passed to the linker):
> address@hidden ~/src/lrde/vaucanson2 $ rm _build/35d/lib/liblal_char_b.la
> address@hidden ~/src/lrde/vaucanson2 $ make V=1 -C _build/35d
> /Applications/Xcode.app/Contents/Developer/usr/bin/make all-am
> /bin/sh ./libtool --tag=CXX --mode=link ccache clang++-mp-3.5 -Wall
> -Wextra -Wcast-align -Wcast-qual -Wdocumentation -Wformat
> -Wmissing-declarations -Wno-parentheses -Woverloaded-virtual -Wpointer-arith
> -Wwrite-strings -Qunused-arguments -ggdb -fsanitize=address -std=c++11
> -L/opt/local/lib -o lib/liblal_char_b.la -rpath /opt/gostai/lib/vcsn
> lib/ctx/lib_liblal_char_b_la-libctx.lo
> libtool: link: rm -fr lib/.libs/liblal_char_b.0.dylib
> lib/.libs/liblal_char_b.dylib lib/.libs/liblal_char_b.la
> lib/.libs/liblal_char_b.lai
> libtool: link: ccache clang++-mp-3.5 -dynamiclib -Wl,-undefined
> -Wl,dynamic_lookup -o lib/.libs/liblal_char_b.0.dylib
> lib/ctx/.libs/lib_liblal_char_b_la-libctx.o -L/opt/local/lib
> -install_name /opt/gostai/lib/vcsn/liblal_char_b.0.dylib
> -compatibility_version 1 -current_version 1.0 -Wl,-single_module
> libtool: link: (cd "lib/.libs" && rm -f "liblal_char_b.dylib" && ln -s
> "liblal_char_b.0.dylib" "liblal_char_b.dylib")
> libtool: link: ( cd "lib/.libs" && rm -f "liblal_char_b.la" && ln -s
> "../liblal_char_b.la" "liblal_char_b.la" )
> /bin/sh ./libtool --tag=CXX --mode=link ccache clang++-mp-3.5 -Wall
> -Wextra -Wcast-align -Wcast-qual -Wdocumentation -Wformat
> -Wmissing-declarations -Wno-parentheses -Woverloaded-virtual -Wpointer-arith
> -Wwrite-strings -Qunused-arguments -ggdb -fsanitize=address -std=c++11
> -avoid-version -module -L/opt/local/lib -Wl,-rpath,/opt/local/lib
> -L/opt/local/lib -o python/vcsn_cxx.la -rpath
> /opt/gostai/lib/python2.7/site-packages python/python_vcsn_cxx_la-vcsn_cxx.lo
> -lboost_python-mt lib/liblal_char_b.la lib/liblal_char_br.la
> lib/liblal_char_q.la lib/liblal_char_r.la lib/liblal_char_z.la
> lib/liblal_char_zr.la lib/liblal_char_zrr.la lib/liblan_char_b.la
> lib/liblan_char_r.la lib/liblan_char_z.la lib/liblan_char_zr.la
> lib/liblao_br.la lib/liblao_z.la lib/liblaw_char_b.la lib/liblaw_char_br.la
> lib/liblaw_char_r.la lib/liblaw_char_z.la lib/liblaw_char_zr.la
> lib/liblaw_char_zrr.la lib/libvcsn.la
> libtool: link: rm -fr python/.libs/vcsn_cxx.la python/.libs/vcsn_cxx.lai
> python/.libs/vcsn_cxx.so
> libtool: link: ccache clang++-mp-3.5 -Wl,-undefined -Wl,dynamic_lookup -o
> python/.libs/vcsn_cxx.so -bundle python/.libs/python_vcsn_cxx_la-vcsn_cxx.o
> -L/opt/local/lib -lboost_python-mt lib/.libs/liblal_char_b.dylib
> lib/.libs/liblal_char_br.dylib lib/.libs/liblal_char_q.dylib
> lib/.libs/liblal_char_r.dylib lib/.libs/liblal_char_z.dylib
> lib/.libs/liblal_char_zr.dylib lib/.libs/liblal_char_zrr.dylib
> lib/.libs/liblan_char_b.dylib lib/.libs/liblan_char_r.dylib
> lib/.libs/liblan_char_z.dylib lib/.libs/liblan_char_zr.dylib
> lib/.libs/liblao_br.dylib lib/.libs/liblao_z.dylib
> lib/.libs/liblaw_char_b.dylib lib/.libs/liblaw_char_br.dylib
> lib/.libs/liblaw_char_r.dylib lib/.libs/liblaw_char_z.dylib
> lib/.libs/liblaw_char_zr.dylib lib/.libs/liblaw_char_zrr.dylib
> lib/.libs/libvcsn.dylib -lboost_filesystem-mt -lboost_system-mt -lltdl
> -Wl,-rpath -Wl,/opt/local/lib
> libtool: link: ( cd "python/.libs" && rm -f "vcsn_cxx.la" && ln -s
> "../vcsn_cxx.la" "vcsn_cxx.la" )
> /bin/sh ./libtool --tag=CXX --mode=link ccache clang++-mp-3.5 -Wall
> -Wextra -Wcast-align -Wcast-qual -Wdocumentation -Wformat
> -Wmissing-declarations -Wno-parentheses -Woverloaded-virtual -Wpointer-arith
> -Wwrite-strings -Qunused-arguments -ggdb -fsanitize=address -std=c++11
> -L/opt/local/lib -o bin/vcsn-tafkit bin/vcsn-tafkit.o bin/parse-args.o
> lib/liblal_char_b.la lib/liblal_char_br.la lib/liblal_char_q.la
> lib/liblal_char_r.la lib/liblal_char_z.la lib/liblal_char_zr.la
> lib/liblal_char_zrr.la lib/liblan_char_b.la lib/liblan_char_r.la
> lib/liblan_char_z.la lib/liblan_char_zr.la lib/liblao_br.la lib/liblao_z.la
> lib/liblaw_char_b.la lib/liblaw_char_br.la lib/liblaw_char_r.la
> lib/liblaw_char_z.la lib/liblaw_char_zr.la lib/liblaw_char_zrr.la
> lib/libvcsn.la
> libtool: link: ccache clang++-mp-3.5 -Wall -Wextra -Wcast-align -Wcast-qual
> -Wdocumentation -Wformat -Wmissing-declarations -Wno-parentheses
> -Woverloaded-virtual -Wpointer-arith -Wwrite-strings -Qunused-arguments -ggdb
> -fsanitize=address -std=c++11 -o bin/.libs/vcsn-tafkit bin/vcsn-tafkit.o
> bin/parse-args.o -Wl,-bind_at_load -L/opt/local/lib
> lib/.libs/liblal_char_b.dylib lib/.libs/liblal_char_br.dylib
> lib/.libs/liblal_char_q.dylib lib/.libs/liblal_char_r.dylib
> lib/.libs/liblal_char_z.dylib lib/.libs/liblal_char_zr.dylib
> lib/.libs/liblal_char_zrr.dylib lib/.libs/liblan_char_b.dylib
> lib/.libs/liblan_char_r.dylib lib/.libs/liblan_char_z.dylib
> lib/.libs/liblan_char_zr.dylib lib/.libs/liblao_br.dylib
> lib/.libs/liblao_z.dylib lib/.libs/liblaw_char_b.dylib
> lib/.libs/liblaw_char_br.dylib lib/.libs/liblaw_char_r.dylib
> lib/.libs/liblaw_char_z.dylib lib/.libs/liblaw_char_zr.dylib
> lib/.libs/liblaw_char_zrr.dylib lib/.libs/libvcsn.dylib -lboost_filesystem-mt
> -lboost_system-mt -lltdl
So what should I do? Am I doing something wrong? I'd like to avoid
having to teach my package to configure itself with ASAN and the others,
it should remain only a question of passing appropriate CXXFLAGS
and other LDFLAGS to configure.
Why does libtool strip these -f? I could not find any instruction
about this in the documentation.
Thanks for reading (the English parts of this message :)!
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- Libtool and ASAN,
Akim Demaille <=