Перемещение - это процесс принятия некоторых смещений в коде для фактического расположения памяти.Перемещения (места, которые будут редактироваться процессом перемещения и описанием каждой перестановки) генерируются компилятором, например, для переменных 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 и у вас много времени ждать)