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: > akim@erebus ~/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: > akim@erebus ~/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). > akim@erebus ~/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): > akim@erebus ~/src/lrde/vaucanson2 $ rm _build/35d/lib/liblal_char_b.la > akim@erebus ~/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 :)! _______________________________________________ https://lists.gnu.org/mailman/listinfo/libtool