C++ 如何让ASan使用4.12.3 Linux内核?

C++ 如何让ASan使用4.12.3 Linux内核?,c++,docker,address-sanitizer,C++,Docker,Address Sanitizer,我正试图在我的docker容器中设置/修复asan。为此,我使用了一个简单的示例程序 int main() { return 16; } 并用 clang++ -std=c++1z -O1 -fsanitize=address test.cpp 使用Clang4.0.1(我使用的-std没有区别) 这在4.12.3-1-ARCH内核版本中产生了错误,我从google或asan FAQ中获得的任何东西似乎都不能改变这一点 $ ./a.out ==13178==Shadow memory ra

我正试图在我的docker容器中设置/修复asan。为此,我使用了一个简单的示例程序

int main() { return 16; }
并用

clang++ -std=c++1z -O1 -fsanitize=address test.cpp
使用Clang4.0.1(我使用的
-std
没有区别)

这在
4.12.3-1-ARCH
内核版本中产生了错误,我从google或asan FAQ中获得的任何东西似乎都不能改变这一点

$ ./a.out 
==13178==Shadow memory range interleaves with an existing memory mapping. ASan cannot proceed correctly. ABORTING.
==13178==ASan shadow was supposed to be located in the [0x00007fff7000-0x10007fff7fff] range.
==13178==Process memory map follows:
    0x00eda9b0a000-0x00eda9c4e000   /tmp/a.out
    0x00eda9e4e000-0x00eda9e4f000   /tmp/a.out
    0x00eda9e4f000-0x00eda9e52000   /tmp/a.out
    0x00eda9e52000-0x00edaab37000   
    0x7f4266de9000-0x7f426713b000   
    0x7f426713b000-0x7f42672d8000   /usr/lib/libc-2.25.so
    0x7f42672d8000-0x7f42674d7000   /usr/lib/libc-2.25.so
    0x7f42674d7000-0x7f42674db000   /usr/lib/libc-2.25.so
    0x7f42674db000-0x7f42674dd000   /usr/lib/libc-2.25.so
    0x7f42674dd000-0x7f42674e1000   
    0x7f42674e1000-0x7f42674f7000   /usr/lib/libgcc_s.so.1
    0x7f42674f7000-0x7f42676f6000   /usr/lib/libgcc_s.so.1
    0x7f42676f6000-0x7f42676f7000   /usr/lib/libgcc_s.so.1
    0x7f42676f7000-0x7f42676f8000   /usr/lib/libgcc_s.so.1
    0x7f42676f8000-0x7f42676fb000   /usr/lib/libdl-2.25.so
    0x7f42676fb000-0x7f42678fa000   /usr/lib/libdl-2.25.so
    0x7f42678fa000-0x7f42678fb000   /usr/lib/libdl-2.25.so
    0x7f42678fb000-0x7f42678fc000   /usr/lib/libdl-2.25.so
    0x7f42678fc000-0x7f4267903000   /usr/lib/librt-2.25.so
    0x7f4267903000-0x7f4267b02000   /usr/lib/librt-2.25.so
    0x7f4267b02000-0x7f4267b03000   /usr/lib/librt-2.25.so
    0x7f4267b03000-0x7f4267b04000   /usr/lib/librt-2.25.so
    0x7f4267b04000-0x7f4267b1d000   /usr/lib/libpthread-2.25.so
    0x7f4267b1d000-0x7f4267d1c000   /usr/lib/libpthread-2.25.so
    0x7f4267d1c000-0x7f4267d1d000   /usr/lib/libpthread-2.25.so
    0x7f4267d1d000-0x7f4267d1e000   /usr/lib/libpthread-2.25.so
    0x7f4267d1e000-0x7f4267d22000   
    0x7f4267d22000-0x7f4267e33000   /usr/lib/libm-2.25.so
    0x7f4267e33000-0x7f4268032000   /usr/lib/libm-2.25.so
    0x7f4268032000-0x7f4268033000   /usr/lib/libm-2.25.so
    0x7f4268033000-0x7f4268034000   /usr/lib/libm-2.25.so
    0x7f4268034000-0x7f42681ae000   /usr/lib/libstdc++.so.6.0.24
    0x7f42681ae000-0x7f42683ad000   /usr/lib/libstdc++.so.6.0.24
    0x7f42683ad000-0x7f42683b7000   /usr/lib/libstdc++.so.6.0.24
    0x7f42683b7000-0x7f42683b9000   /usr/lib/libstdc++.so.6.0.24
    0x7f42683b9000-0x7f42683bc000   
    0x7f42683bc000-0x7f42683df000   /usr/lib/ld-2.25.so
    0x7f42685b7000-0x7f42685c9000   
    0x7f42685cb000-0x7f42685da000   
    0x7f42685da000-0x7f42685df000   
    0x7f42685df000-0x7f42685e0000   /usr/lib/ld-2.25.so
    0x7f42685e0000-0x7f42685e1000   /usr/lib/ld-2.25.so
    0x7f42685e1000-0x7f42685e2000   
    0x7ffda4652000-0x7ffda4673000   [stack]
    0x7ffda46cc000-0x7ffda46cf000   [vvar]
    0x7ffda46cf000-0x7ffda46d1000   [vdso]
    0xffffffffff600000-0xffffffffff601000   [vsyscall]
==13178==End of process memory map.

这可能是由于内核中最近的更改导致的,这些更改改变了它加载饼图可执行文件的方式。问题是

目前唯一的解决方法(除了使用旧内核)是使用

  • CFLAGS+=-无饼图
  • CFLAGS+=-mllvm-asan force dynamic shadow=1
    (仅限叮当声)

至少从内核版本
4.12.10-1-ARCH
开始,这是固定的


而且(显然)较新的编译器版本也可以工作,但我没有亲自进行测试。

从讨论中我真的无法判断是否有解决方法。实际上,我已经尝试了第二种,但没有改变。第一个不为clang所理解。@bitmask是否对clang起作用?要按照"三个代表"的要求,。你能检查一下你的内核是否包含有问题的commit吗?这是最近的一次(2017年7月)。
-fno-PIE
对clang有效,但也不能解决问题。内核是
4.12.3-1-ARCH
,因此它包含提交。