启用GCC AddressSanitizer后运行时出现swift_demangle符号未找到错误
启用GCC AddressSanitizer后运行时提示找不到
swift_demangle符号的问题 我在OpenWRT构建环境中使用GCC 7.5.0交叉编译程序,添加-fsanitize=address选项来排查内存泄漏问题。交叉编译过程无异常,但在目标环境运行可执行文件时,出现symbol not found错误,具体提示为get cfg_loadRemoteCfgs fail:Symbol not found: swift_demangle。
环境信息
GCC版本详情:
aarch64-openwrt-linux-musl-gcc (OpenWrt GCC 7.5.0 r11-afafb2b1c) 7.5.0 Copyright (C) 2017 Free Software Foundation, Inc.
C库:MUSL libc
编译配置修改
CMake编译参数修改:
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Os -g -Wall --std=gnu99 -fsanitize=address -fno-omit-frame-pointer")
依赖添加:
NUSPD_DEPENDS := +libuci +libubox +libubus +libblobmsg-json +cfgmgr +libjson-c libixml +libcurl +idl2json +obj2json +libasan
运行报错及依赖检查
root@Bean10:/home/superadmin# Nuspd **get cfg_loadRemoteCfgs fail:Symbol not found: swift_demangle** root@Bean10:/home/superadmin# ldd --list /sbin/Nuspd | grep -i asan libasan.so.4 => /usr/lib/libasan.so.4 (0x7f7fcc8000) root@Bean10:/home/superadmin# ls /usr/lib/libasan.so* -lh lrwxrwxrwx 1 root root 16 Jun 27 17:44 /usr/lib/libasan.so -> libasan.so.4.0.0 lrwxrwxrwx 1 root root 16 Jun 27 17:44 /usr/lib/libasan.so.4 -> libasan.so.4.0.0 -rwxr-xr-x 1 root root 905.7K Jun 27 17:44 /usr/lib/libasan.so.4.0.0
注:cfg_loadRemoteCfgs符号属于程序已链接的libcfg.so共享库
strace输出片段
--- SIGILL {si_signo=SIGILL, si_code=ILL_ILLOPC, si_addr=0x7fb962f690} --- rt_sigprocmask(SIG_SETMASK, ~[ILL TRAP BUS FPE KILL SEGV STOP RTMIN RT_1 RT_2], NULL, 8) = 0 rt_sigprocmask(SIG_SETMASK, NULL, ~[ILL TRAP BUS FPE KILL SEGV STOP RTMIN RT_1 RT_2], 8) = 0 rt_sigaction(SIGILL, {sa_handler=SIG_DFL, sa_mask=[], sa_flags=SA_RESTORER, sa_restorer=0x7fbad42e90}, NULL, 8) = 0 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb6200000 munmap(0x7fb6300000, 1048576) = 0 mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb6000000 munmap(0x7fb6100000, 1048576) = 0 mmap(NULL, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fb5e00000 munmap(0x7fb5f00000, 1048576) = 0 writev(2, [{iov_base="get cfg_loadRemoteCfgs fail:Symb"..., iov_len=61}, {iov_base=NULL, iov_len=0}], 2get cfg_loadRemoteCfgs fail:Symbol not found: swift_demangle ) = 61
ASAN/LSAN详细日志输出
root@Bean10:/home/superadmin# LSAN_OPTIONS=verbosity=1:log_threads=1 Nuspd ==10901==LeakSanitizer: Dynamic linker not found. TLS will not be handled correctly. ==10901==AddressSanitizer Init done get cfg_loadRemoteCfgs fail:Symbol not found: swift_demangle ==10902==Processing thread 10901. ==10902==Stack at 0x007ff5a57000-0x007ff6257000 (SP = 0x007ff6255fc0). ==10902==TLS at 0x000000000000-0x000000000000.
我想了解为何启用GCC AddressSanitizer选项后,运行时链接器无法找到swift_demangle这个符号。
内容的提问来源于stack exchange,提问作者renga_in_stack
相关产品推荐
相关产品推荐

