Как добавить каталог к ​​пути к библиотеке при загрузке основного файла в gdb в Linux

У меня есть основной файл, сгенерированный в удаленной системе, к которой у меня нет прямого доступа. У меня также есть локальные копии файлов библиотеки из удаленной системы и исполняемый файл аварийной программы.

Я хотел бы проанализировать этот дамп ядра в gdb.

Например:

gdb path/to/executable path/to/corefile

Мои библиотеки находятся в текущем каталоге.

В прошлом я видел, как отладчики реализуют это, предоставляя параметр «-p». или "-p /=."; поэтому мой вопрос:

Как я могу указать, что библиотеки загружаются первыми из путей относительно моего текущего каталога при анализе файла ядра в gdb?


person Mike Tunnicliffe    schedule 17.09.2008    source источник


Ответы (5)


Запустите gdb, не указывая исполняемый файл или файл ядра, затем введите следующие команды:

set solib-absolute-prefix ./usr
file path/to/executable
core-file path/to/corefile

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

Если вы удаленно отлаживаете сервер с той же архитектурой и версией Linux/glibc, что и ваш хост, вы можете сделать это как fd предложил:

set solib-search-path <path>

Если вы пытаетесь переопределить некоторые из библиотек, но не все, вы можете скопировать структуру каталогов целевой библиотеки во временное место и использовать решение solib-absolute-prefix, описанное выше.

person Drew Frezell    schedule 17.09.2008
comment
Я немного ошибся в пути, поэтому вы можете обновить свой ответ, чтобы он соответствовал. Я поддержу этот ответ, потому что он частично соответствует моему требованию, но я должен более четко заявить, что хочу добавить местоположение к пути к библиотеке, а не заменить его (моя ошибка в использовании слова переопределить). - person Mike Tunnicliffe; 17.09.2008
comment
Спасибо, это действительно помогло мне! - person Martin C.; 29.09.2010
comment
В моем случае исполняемый файл и его библиотеки находились в дереве, смонтированном на NFS, а хост, с которого я хотел выполнить отладку, был сервером NFS, поэтому я поместил в дерево символическую ссылку, чтобы solib-absolute-prefix nfs-share-tree был точное решение. Я надеюсь, что это поможет будущим поколениям. - person cardiff space man; 05.06.2012

Я не уверен, что это вообще возможно в gdb, но тогда я не эксперт.

Однако я могу прокомментировать динамический компоновщик Linux. Следующее должно напечатать путь ко всем разрешенным разделяемым библиотекам и неразрешенным.

ldd path/to/executable

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

readelf -d path/to/executable | grep RPATH
  • Если команда ничего не напечатает, динамический компоновщик будет использовать стандартные местоположения плюс переменную среды LD_LIBRARY_PATH для поиска общих библиотек.

  • Если команда напечатает несколько строк, динамический компоновщик проигнорирует LD_LIBRARY_PATH и вместо этого будет использовать жестко заданные пути rpath.

    Если перечисленные rpaths являются абсолютными, единственным известным мне решением является копирование (или символическая ссылка) ваших библиотек в указанные места.

    Если перечисленные rpaths являются относительными, они будут содержать $ORIGIN, который будет заменен во время выполнения путем к исполняемому файлу. Переместите либо исполняемый файл, либо библиотеки, чтобы они соответствовали.

Для получения дополнительной информации вы можете начать с:

man ld.so
person bltxd    schedule 17.09.2008
comment
очень полезная информация. не связано с gdb, но очень связано с моим случаем поиска путей ld - person Phyo Arkar Lwin; 02.11.2012

Я нашел этот отрывок на developer.apple.com

set solib-search-path path

Если эта переменная установлена, путь представляет собой список каталогов, разделенных двоеточием, для поиска разделяемых библиотек. solib-search-path' is used after solib-absolute-prefix' не может найти библиотеку или если путь к библиотеке является относительным, а не абсолютным. Если вы хотите использовать solib-search-path' instead of solib-absolute-prefix', обязательно установите для `solib-absolute-prefix' несуществующий каталог, чтобы GDB не смог найти библиотеки вашего хоста.

ИЗМЕНИТЬ:

Я не думаю, что при использовании вышеуказанного параметра добавляются каталоги, которые я добавил, но, похоже, они добавляются, поэтому файлы, отсутствующие в моей текущей системе, подбираются по добавленным мною путям. Я предполагаю, что установка solib-absolute-prefix на что-то фиктивное и добавление каталогов в solib-search-path в нужном мне порядке может быть полным решением.

person Mike Tunnicliffe    schedule 17.09.2008

Вы также можете просто установить LD_PRELOAD для каждой из библиотек или LD_LIBRARY_PATH для текущего каталога при вызове gdb. Это вызовет проблемы только в том случае, если gdb сам попытается использовать какую-либо из библиотек, которые вы предварительно загружаете.

person Joseph Garvin    schedule 02.10.2012
comment
Команда LD_LIBRARY_PATH=. gdb executableName.bin работал нормально. Спасибо. - person Antonio Rizzo; 18.03.2015

Одно важное замечание:

если вы делаете кросс-компиляцию и пытаетесь отладить с помощью gdb, то после того, как вы сделали
file ECECUTABLE_NAME, если вы видите что-то. как :

Using host libthread_db library "/lib/libthread_db.so.1"

затем проверьте, есть ли у вас libthread_db для вашей целевой системы. Я нашел много подобных проблем в Интернете. Такую проблему нельзя решить только с помощью "set solib-", вам также необходимо собрать libthread_db с помощью вашего кросс-компилятора.

person psihodelia    schedule 20.07.2010