【发布时间】:2023-03-10 19:18:01
【问题描述】:
在链接我使用 AddressSanitizer 工具编译的代码时,我遇到了许多 undefined reference to '_asan_init_v4' 类型的错误。
clang -fPIC -g -fno-omit-frame-pointer -DNDEBUG -Wl,-z,defs \
-shared -Wl,-soname,libqpid-dispatch.so -o libqpid-dispatch.so \
CMakeFiles/qpid-dispatch.dir/alloc_pool.c.o \
CMakeFiles/qpid-dispatch.dir/amqp.c.o \
[...]
-lpthread -lrt -ldl -lpython3.7m -lwebsockets -fsanitize=address
一些错误示例
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: CMakeFiles/qpid-dispatch.dir/http-libwebsockets.c.o: in function `qd_http_server_free':
/home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:824: undefined reference to `__ubsan_handle_type_mismatch_v1'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__ubsan_handle_type_mismatch_v1'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__ubsan_handle_type_mismatch_v1'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__ubsan_handle_type_mismatch_v1'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__ubsan_handle_type_mismatch_v1'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__asan_report_load8'
/nix/store/1zf4cnaaidjajwb4gx4mnkqc5dypkcdy-binutils-2.31.1/bin/ld: /home/jdanek/repos/qpid/qpid-dispatch/src/http-libwebsockets.c:825: undefined reference to `__asan_report_load8'
注意:我使用的是 NixOS 19.09 和 Clang 10。
【问题讨论】:
-
能否提供更多关于如何编译代码的详细信息(例如编译和链接行)。
-
编译错误:-Wall,-g,Wextra,-Wno-missing-field-initializers,-Wformat=2,-Wpointer-arith,-fno-omit-frame-pointer,-m64, -D_LARGEFILE_SOURCE,-D_FILE_OFFSET_BITS=64,-fsanitize=address,-fno-stack-protector,-fno-omit-frame-pointer,-fsanitize-recover=address,-fsanitize=undefined,-D_GLIBCXX_USE_CXX11_ABI=0,-fgnu89-inline
-
链接标志:-m64,-rdynamic,-fsanitize=address,-fsanitize-recover=address,-fsanitize=undefined,-D_GLIBCXX_USE_CXX11_ABI=0
-
嗯,我想到的唯一想法是您机器上的 GCC 和 libasan 不同步。您是否使用自定义 GCC?您能否运行
readelf -sW FILENAME | grep asan_init并将FILENAME设置为使用-fsanitize=address和path/to/libasan.so编译的目标文件之一?