Linux 未定义对'的引用_asan#u init#u v4';编译时

Linux 未定义对'的引用_asan#u init#u v4';编译时,linux,address-sanitizer,Linux,Address Sanitizer,当链接我用AddressSanitizer工具编译的代码时,我得到了许多类似于未定义引用“\u asan\u init\u 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 \ CM

当链接我用AddressSanitizer工具编译的代码时,我得到了许多类似于
未定义引用“\u asan\u init\u 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。

我不确定这是否是问题所在,但对我来说,将
-lasan
添加到链接器选项足以让我的程序生成并运行。

你应该使用编译标志
-fsanize=address


请注意,
-fsanize=address
=
-lasan
+一些附加选项。ASan开发人员不鼓励使用
-lasan

-static libasan
添加到链接器标志将解决此问题。

能否提供有关如何编译代码的更多详细信息(例如编译和链接行)。编译错误:-Wall,-g,Wextra,-Wno缺少字段初始值设定项,-Wformat=2,-Wpointer arith,-fno省略帧指针,-m64,-D_LARGEFILE\u SOURCE,-D_FILE\u OFFSET\u BITS=64,-fanizize=address,-fno stack protector,-fno省略帧指针,-fanizize recover=address,-fanizize=address,-fanizize=undefined,-D_GLIBCXX使用\u cx11_ABI=0,-fgnelink标志:-m64,-rdynamic,-fanizize=address,-fanizize=address,-fanizize=address,-fanizize=undefined,-D_glibcx11=0Hm,我唯一想到的是你机器上的GCC和libasan不同步。您正在使用自定义GCC吗?您是否可以运行
readelf-sW FILENAME | grep asan_init
,将
FILENAME
设置为使用
-fsanize=address
编译的目标文件之一,并设置为
路径/to/libasan。因此
-fsanize=address
的可能副本对于GCC来说是不够的。@jhasse:您有这样的链接吗?请注意,您需要
-fsanize=address
CFLAGS
/
cxflags
LDFLAGS
中,如上所述。
-static libasan
不建议在GCC上使用(不太受支持,请参见示例)。这个答案是错误的,添加
-lasan
已被Asan开发人员多次劝阻,例如在。唯一受支持的方法是在
CFLAGS
/
cxflags
LDFLAGS
中使用
-fsanize=address
(请参阅)。