AWS Linux 2下使用gcc启用动态链接libasan(address sanitizer)报错如何解决
问题原因
你遇到的file too short报错核心原因是:gcc -print-file-name=libasan.so返回的路径对应的文件并不是真实的ELF格式动态共享库,而是GCC使用的链接脚本(纯文本文件,体积很小所以会提示file too short),ld.so加载预加载库时只识别ELF格式文件,无法解析链接脚本,因此加载失败。
AWS Linux 2默认环境通常不会预装ASAN的运行时库,也是可能的诱因之一。
解决步骤
- 第一步:安装对应版本的ASAN运行时包
GCC 7.x在AWS Linux 2中对应的ASAN运行时包为libasan4,执行以下命令安装:sudo yum install -y libasan4 - 第二步:确认真实的libasan共享库路径
安装完成后,64位架构下真实的ASAN库路径为/usr/lib64/libasan.so.4,执行以下命令验证文件格式是否为ELF动态库:
输出包含file /usr/lib64/libasan.so.4ELF 64-bit LSB shared object即为有效。 - 第三步:替换LD_PRELOAD路径启动程序
运行时将预加载路径替换为上述真实库路径即可:LD_PRELOAD=/usr/lib64/libasan.so.4 python your_test_script.py
可选优化配置
如果需要更清晰的错误栈或开启泄漏检测,可以添加以下环境变量:
- 编译扩展时添加
-fno-omit-frame-pointer参数,优化栈打印效果 - 运行时添加
ASAN_OPTIONS=detect_leaks=1开启内存泄漏检测 - 运行时添加
PYTHONMALLOC=malloc强制Python使用系统内存分配器,避免Python自带分配器干扰ASAN检测结果
内容的提问来源于stack exchange,提问作者Bobby Impollonia
相关产品推荐
相关产品推荐

