【问题标题】:undefined reference to '_asan_init_v4' when compiling编译时对“_asan_init_v4”的未定义引用
【发布时间】: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=addresspath/to/libasan.so 编译的目标文件之一?

标签: linux address-sanitizer


【解决方案1】:

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

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

【讨论】:

  • -fsanitize=address 对 GCC 来说还不够。
  • @jhasse:你有这方面的证明链接吗?请注意,CFLAGS/CXXFLAGSLDFLAGS 中都需要 -fsanitize=address,如 here 所述。
  • 实际上在我的情况下,添加 -fsanitize=address 会使整个事情中断,但删除它会使其工作。
【解决方案2】:

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

【讨论】:

  • 这个答案是错误的,添加-lasan 已被 Asan 开发人员多次劝阻,例如在this thread。唯一受支持的方法是在CFLAGS/CXXFLAGSLDFLAGS 中都使用-fsanitize=address(参见this answer)。
【解决方案3】:

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

【讨论】:

  • -static-libasan 不建议在 GCC 上使用(不太支持,请参阅例如 PR 64234)。
猜你喜欢
  • 2012-08-16
  • 2016-04-25
  • 2012-02-20
  • 2019-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多