DPDK 21.11开启AddressSanitizer编译提示找不到asan库如何解决
问题说明
基于DPDK 21.11版本开发应用时,需要启用AddressSanitizer排查潜在内存损坏问题,已安装系统源的libasan依赖,在meson构建参数中添加-Db_sanitize=address编译DPDK时构建失败,最终报错:
config/meson.build:427:8: ERROR: C shared or static library 'asan' not found
构建环境关键信息如下:
- 系统已安装libasan版本:
libasan-8.5.0-10.el8.x86_64 - 实际构建使用的C编译器:gcc-toolset-10提供的GCC 10.3.1
- Meson版本:0.61.2
- 操作系统:RHEL/CentOS 8 x86_64
故障根因
系统yum源默认安装的libasan是与系统自带GCC 8.5版本匹配的运行库,而当前构建环境实际调用的是gcc-toolset-10提供的GCC 10.3.1版本。Meson启用sanitize参数时,会查找当前生效编译器版本对应的asan开发库,GCC 10.3版本匹配的libasan未安装,且工具集的库路径未被正确纳入搜索范围,因此触发找不到asan库的报错。
解决步骤
- 安装与当前生效GCC版本匹配的asan开发库,针对gcc-toolset-10环境执行以下命令:
yum install gcc-toolset-10-libasan-devel - 确认shell环境正确激活gcc-toolset-10,避免编译过程混用不同版本GCC的头文件与库文件:
激活后执行两个校验命令确认环境正常:scl enable gcc-toolset-10 bashgcc --version,输出确认版本为10.3.1ld -lasan --verbose,输出中无cannot find -lasan报错,能定位到libasan.so文件
- 清理之前失败构建产生的缓存目录,重新执行meson配置:
rm -rf build meson -Db_sanitize=address -Dprefix=/ build - 配置无报错后,执行编译与安装:
cd build ninja -j$(nproc) ninja install
配置注意事项
- 后续编译自研DPDK应用时,需要保持和DPDK编译时一致的GCC环境,同时添加
-fsanitize=address的编译、链接参数,否则ASan无法正常检测应用层的内存问题。 - 运行ASan版本的DPDK程序前,可根据调试需求配置ASan运行时参数,比如调整检测粒度、关闭非必要的泄漏检测、配置符号化路径,避免DPDK大页内存、轮询驱动的特殊逻辑触发误报。
内容的提问来源于stack exchange,提问作者nmurshed
相关产品推荐
相关产品推荐

