libtool
[Top][All Lists]
Advanced

[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 :)!


reply via email to

[Prev in Thread] Current Thread [Next in Thread]