使用ASAN时如何解决错误“无法运行C编译程序”

时间:2019-08-12 15:30:00

标签: linux configure ptrace address-sanitizer

问题:运行configure脚本可以正常工作,可以使用C编译器并运行生成的程序。添加ASAN后,配置脚本会抱怨生成的程序无法运行。

./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
...

vs。

./configure CFLAGS="-fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer -fstack-protector" LDFLAGS="-fsanitize=undefined -fsanitize=address" --enable-debug
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether CFLAGS can be modified... yes
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... configure: error: in `/tmp/test-asan':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details

config.log显示:

configure:3653: checking whether we are cross compiling
configure:3661: gcc -o conftest -fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer -fstack-protector  -fsanitize=undefined -fsanitize=address conftest.c  >&5
configure:3665: $? = 0
configure:3672: ./conftest
==9941==LeakSanitizer has encountered a fatal error.
==9941==HINT: For debugging, try setting environment variable LSAN_OPTIONS=verbosity=1:log_threads=1
==9941==HINT: LeakSanitizer does not work under ptrace (strace, gdb, etc)
configure:3676: $? = 1
configure:3683: error: in `/tmp/test-asan':
configure:3685: error: cannot run C compiled programs.

1 个答案:

答案 0 :(得分:0)

configure脚本中的错误消息非常混乱(不涉及交叉编译),L​​eakSanitizer的提示并不好(我们不进行任何调试),但包含一个重要提示:ptrace。

GDB + ptrace question中暗示的问题是,Yama kernel security module已配置为防止ASAN使用ptrace。

要解决此问题,请执行以下操作:

  • 选项1: 在评估的外壳程序中运行配置脚本(和以后的测试) (sudo bash
  • 选项2(在本地/受保护的计算机上[可能是VM /沙盒]): 允许每个人echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
  • 使用ptrace

这样做时,配置脚本会按预期运行,并且如果清理程序发现任何错误,则生成的程序会在退出时中止。