gpt4 book ai didi

static-libraries - 在静态库配置中使用 Clang sanitizer 配置自动工具项目?

转载 作者:行者123 更新时间:2023-12-04 14:45:49 25 4
gpt4 key购买 nike

编辑 : 如果是 TLDR,直接跳到底部。我问的地方:如何配置 autotools 项目以使用静态库?

我正在使用几个开源库,并且我正在尝试在 Clang 的 sanitizers 下运行他们的测试套件。要在 Clang sanitizers 下运行,我们需要 (1) 指定一些选项,以及 (2) 根据需要从 Clang 的 Compiler-RT 链接静态库。注意:没有动态库或共享对象。

设置选项很简单:

export DYLD_FALLBACK_LIBRARY_PATH=/usr/local/lib/clang/3.3/lib/darwin/
export CC=/usr/local/bin/clang
export CXX=/usr/local/bin/clang++
export CFLAGS="-g3 -fsanitize=address -fsanitize=undefined"
export CXXFLAGS="-g3 -fsanitize=address -fsanitize=undefined -fno-sanitize=vptr"

./configure

但是,这将生成一些带有 undefined symbol 的存档警告(当 AR 运行时)和链接错误(当 LD 运行时)。该消息将类似于:
libjpeg.a(jmemmgr.o): In function `do_sarray_io':
/home/jwalton/jpeg-6b/jmemmgr.c:695: undefined reference to
`__ubsan_handle_type_mismatch'
/home/jwalton/jpeg-6b/jmemmgr.c:695: undefined reference to
`__ubsan_handle_type_mismatch'
/home/jwalton/jpeg-6b/jmemmgr.c:696: undefined reference to
`__ubsan_handle_type_mismatch'

我知道需要链接的库。对于我使用的 sanitizer ,它们是 libclang_rt.asan_osx.alibclang_rt.ubsan_osx.a (或 libclang_rt.full-x86_64.alibclang_rt.ubsan-x86_64.a 在 Linux 上)。

为了提供库,我然后导出以下内容。注:是 LIBS ,而不是 LDLIBS正如大多数其他人所预期的 make相关工具。
export LIBS="/usr/local/lib/clang/3.3/lib/darwin/libclang_rt.asan_osx.a \
/usr/local/lib/clang/3.3/lib/darwin/libclang_rt.ubsan_osx.a"

这会导致 configure问题:
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
...

看着 config.log ,看起来有两个问题正在发生。首先,通过从 /usr/local/... 更改路径正在被屠宰至 /Users/jwalton/... .其次,文件名正在通过从静态库更改为动态库而被屠杀:
configure:3346: ./conftest
dyld: Library not loaded: /Users/jwalton/clang-llvm/llvm-3.3.src/Release+Asserts/lib/clang/3.3/lib/darwin/libclang_rt.asan_osx_dynamic.dylib
Referenced from: /Users/jwalton/libpng-1.6.7/./conftest
Reason: image not found

在另一次尝试中,我尝试使用 LDFLAGS :
export LDFLAGS="-L/usr/local/lib/clang/3.3/lib/darwin/"
export LIBS="libclang_rt.asan_osx.a libclang_rt.ubsan_osx.a"

这会导致类似的错误:
configure: error: in `/Users/jwalton/libpng-1.6.7':
configure: error: C compiler cannot create executables

config.log :
configure:3209: /usr/local/bin/clang -g3 -fsanitize=address -fsanitize=undefined  -L/usr/local/lib/clang/3.3/lib/darwin/ conftest.c libclang_rt.asan_osx.a libclang_rt.ubsan_osx.a >&5
clang: error: no such file or directory: 'libclang_rt.asan_osx.a'
clang: error: no such file or directory: 'libclang_rt.ubsan_osx.a'

并删除 lib前缀和 .a来自 LIBS 的后缀结果是:
configure:3209: /usr/local/bin/clang -g3 -fsanitize=address -fsanitize=undefined  -L/usr/local/lib/clang/3.3/lib/darwin/ conftest.c clang_rt.asan_osx clang_rt.ubsan_osx >&5
clang: error: no such file or directory: 'clang_rt.asan_osx'
clang: error: no such file or directory: 'clang_rt.ubsan_osx'

并添加 -lLIBS结果是:
configure:3335: /usr/local/bin/clang -o conftest -g3 -fsanitize=address -fsanitize=undefined  
-L/usr/local/lib/clang/3.3/lib/darwin/ conftest.c -lclang_rt.asan_osx -lclang_rt.ubsan_osx >&5
configure:3339: $? = 0
configure:3346: ./conftest
dyld: could not load inserted library: /Users/jwalton/libpng-1.6.7/./conftest

./configure: line 3348: 38224 Trace/BPT trap: 5 ./conftest$ac_cv_exeext

最后, -L论据有效:
$ ls /usr/local/lib/clang/3.3/lib/darwin/
libclang_rt.10.4.a libclang_rt.ios.a
libclang_rt.asan_osx.a libclang_rt.osx.a
libclang_rt.asan_osx_dynamic.dylib libclang_rt.profile_ios.a
libclang_rt.cc_kext.a libclang_rt.profile_osx.a
libclang_rt.cc_kext_ios5.a libclang_rt.ubsan_osx.a
libclang_rt.eprintf.a

在所有背景之后:如何配置 autotools 项目以使用静态库?

加分项:为什么如此简单的事情变得如此困难?

最佳答案

您还需要向 LDFLAGS 添加 -fsanitize 标志。

关于static-libraries - 在静态库配置中使用 Clang sanitizer 配置自动工具项目?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20152330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com