Ошибка перемещения GCC во время выполнения - PullRequest
7 голосов
/ 31 августа 2011

В настоящее время я использую многопоточный код, который компилируется без ошибок и предупреждений, и я получаю эту ошибку при выполнении кода:

ошибка перемещения: /lib/x86_64-linux-gnu/libgcc_s.so.1: 1thread_mutex_locXãƨ + Ȩ + ƨ + & 쏭 Ũ Ȩ + e

Что такое ошибка перемещения?

1 Ответ

7 голосов
/ 01 сентября 2011

Перемещение - это процесс принятия некоторых смещений в коде для фактического расположения памяти.Перемещения (места, которые будут редактироваться процессом перемещения и описанием каждой перестановки) генерируются компилятором, например, для переменных TLS, для динамических вызовов библиотеки, для кода PIC / PIE.Описание перемещения хранится в двоичном файле (например, в формате ELF в Linux).

Перемещение частично выполняется на этапе компоновки с помощью программы компоновщика ld в linux;другие компоновщики в других ОС.

Но есть некоторые перемещения, которые нельзя сделать в автономном режиме (до запуска программы).Такие перемещения необходимы для использования ASLR (рандомизации размещения адресного пространства) для загрузки динамических библиотек.Поэтому некоторые из них выполняются непосредственно перед запуском программы с помощью интерпретатора программы , (ld.so в linux), который также называется компоновщиком времени выполнения.Он загрузит вашу программу и ее динамические библиотеки в память и выполнит перемещение.

Третье место, где выполняется перемещение: это вызов dlopen()libdl.so в unix).Это библиотека для динамической загрузки динамических библиотек;и поскольку у динамических библиотек есть перемещения, эта библиотека должна делать их тоже.

Сообщение об ошибке от какого-то компоновщика, и если вы видите это после запуска программы, это второй (ld.so) или третий случай (libdl).

Я не могу найти точное место, где генерируется это сообщение, но это возможно из-за

  • повреждения памяти или данных на диске (не-ecc-память или другая аппаратная ошибка), что сделало некоторые данные неверными.Сделать перезагрузку;проверка файловой системы и md5sums;переустановка используемых пакетов (glibc; libgcc);перекомпилируйте ваше приложение;перепрограммируйте свою память, уменьшите частоту памяти.
  • был использован какой-то неопределенный символ.Попробуйте установить переменную окружения LD_BIND_NOW (если вы используете glibc или производную) в ненулевое значение.
  • программа повредила свою память.например, с помощью переполнения стека или случайного перемещения указателя, или чего-то подобного.Попробуйте использовать valgrind (если вы используете Intel).
  • Ошибка синхронизации, которая позволяет программе самостоятельно разбивать память.Используйте valgrind --tool=helgrind (если вы используете Intel и у вас много времени ждать)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...