Я пытаюсь диагностировать ошибки компоновщика/времени выполнения, используя setenv LD_BIND_NOW TRUE
. Когда я запускаю исполняемый файл с включенной опцией, я получаю ошибку
lib/libmkl_intel_thread.so: error: symbol lookup error: undefined symbol: DftiFreeDescriptor (fatal)
Однако, если я LD_BIND_NOW
переменную окружения LD_BIND_NOW
, программа выполняется просто отлично (до завершения, после чего она сообщает о повреждении памяти, хотя это может быть не связано).
Поэтому я немного смущен: как программа выполняется, когда у нее есть ошибка поиска символа? Я думал, что это должно закончиться, поскольку программа написана в C++, а не в Java. (См. Здесь для справки.)
Кроме того, означает ли эта ошибка, что мой rpath
установлен неправильно, или MKL был построен неправильно? Есть ли решение, которое может быть достигнуто в ограниченное время?
Во-первых, я думал, что вам нужен LD_BIND_NOW=1
(в отличие от TRUE
, хотя это может быть синоним).
Во-вторых, хотя ваше приложение не было связано, если бы был неразрешенный символ, возможно ли, что вы сделали некоторую форму обновления разделяемой библиотеки, чтобы одна из используемых библиотек теперь использует библиотеку в свою очередь с неразрешенным символом? Или что он использует другую библиотеку для того, с чем она была связана?
LD_BIND_NOW=1
- синтаксическая ошибка в RHEL; это правильный синтаксис в других дистрибутивах. Как определить, выполнил ли я обновление совместно используемой библиотеки, в результате чего одна библиотека использовала другую с неразрешенным символом?objdump -T
на исполняемом файле (или вызывающей библиотеке) и вызываемой библиотеке и посмотрите, действительно ли исполняемый файл ссылается на символ, который библиотека не предоставляет.