Ошибка теневой памяти и fPie при запуске кода с помощью средства очистки потока? - PullRequest
0 голосов
/ 27 августа 2018

Следующий пример кода скомпилирован с последующим вводом командной строки

#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.

Я запускаю это с версией g ++, которая имеет fSanitize, поэтому я не уверен, где источник проблемы?

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

1 Ответ

0 голосов
/ 29 августа 2018

GCC слишком стар для ядра Linux, используемого в вашем RedHat. Из-за сопоставленного адреса 0x56167ae3b000 я предполагаю, что версия ядра - 4.1+ (или перенесена из версии ядра 4.1+), которая отображает двоичные файлы в 0x550000000000. Этот сопоставленный адрес поддерживается GCC начиная с версии 7.1.1. Пожалуйста, попробуйте добавить флаг компилятора -static-libtsan. Если это не поможет, вам нужно обновить компилятор.

...