使用线程清理程序运行代码时,影子内存和fPie错误?

时间:2018-08-27 14:29:24

标签: c++11 g++ thread-sanitizer

下面的代码示例是使用随后的命令行输入编译的

#include <pthread.h>
#include <stdio.h>
#include <string>
#include <map>

typedef std::map<std::string, std::string> map_t;

void *threadfunc(void *p) {
  map_t& m = *(map_t*)p;
  m["foo"] = "bar";
  return 0;
}

int main() {
  map_t m;
  pthread_t t;
  pthread_create(&t, 0, threadfunc, &m);
  printf("foo=%s\n", m["foo"].c_str());
  pthread_join(t, 0);
}

命令行输入:

g++ thread.cpp -fsanitize=thread -fPIE -pie -lpie -g

它可以正常编译,但是在运行代码时会出现运行时错误。

FATAL: ThreadSanitizer can not mmap the shadow memory (something is mapped at 0x56167ae3b000 < 0x7cf000000000)
FATAL: Make sure to compile with -fPIE and to link with -pie.

我正在使用具有fSanitize功能的g ++版本运行此程序,因此我不确定问题的根源在哪里?

g++ (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)

1 个答案:

答案 0 :(得分:0)

对于RedHat中使用的Linux内核,GCC太旧了。由于映射地址为0x56167ae3b000,我猜内核版本为4.1+(或从4.1+内核版本向后移植),将二进制文件映射为0x550000000000。从7.1.1版本开始,GCC支持此映射地址。请尝试添加编译器标志-static-libtsan。如果没有帮助,则需要升级编译器。