编译时未定义对“_asan_init_v4”的引用

vam*_*shi 14 linux address-sanitizer

链接我使用 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
Run Code Online (Sandbox Code Playgroud)

错误的一些例子

/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'
Run Code Online (Sandbox Code Playgroud)

注意:我使用的是 NixOS 19.09 和 Clang 10。

Bol*_*ain 10

您应该使用编译标志-fsanitize=addresshttps : //github.com/google/sanitizers/wiki/AddressSanitizer

请注意-fsanitize=address= -lasan+ 一些附加选项。并且-lasanASan 开发人员不鼓励使用。

  • @jhasse:你有这方面的证明链接吗?请注意,您需要在 `CFLAGS`/`CXXFLAGS` 和 `LDFLAGS` 中都需要 `-fsanitize=address`,如[此处](/sf/answers/2815094761/) 所述。 (4认同)
  • `-fsanitize=address` 对 GCC 来说是不够的。 (2认同)
  • 实际上,就我而言,添加“-fsanitize=address”会使整个事情崩溃,但删除它会使它起作用。 (2认同)

Vin*_*ond -1

我不确定这就是问题所在,但对我来说,添加-lasan链接器选项足以让我的程序构建和运行。

  • 这个答案是错误的,添加 `-lasan` 已被 Asan 开发人员多次劝阻,例如在 [this thread](https://groups.google.com/d/msg/address-sanitizer/SD590XDinfQ/NMUPj_G0BgAJ) 中。唯一支持的方法是在“CFLAGS”/“CXXFLAGS”和“LDFLAGS”中使用“-fsanitize=address”(请参阅​​[此答案](/sf/answers/2815094761/))。 (9认同)