Как добавить в каталог путь к библиотеке при загрузке файла ядра в gdb в Linux - PullRequest
25 голосов
/ 17 сентября 2008

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

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

Например:

gdb path/to/executable path/to/corefile

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

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

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

Ответы [ 5 ]

41 голосов
/ 17 сентября 2008

Запустите 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, описанное выше.

4 голосов
/ 17 сентября 2008

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

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

ldd path/to/executable

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

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

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

    Если перечисленные rpath являются абсолютными, единственное решение, которое я знаю, - это скопировать (или символическую ссылку) ваши библиотеки в указанные местоположения.

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

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

man ld.so
3 голосов
/ 17 сентября 2008

Я нашел этот отрывок на 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 от поиска библиотек вашего хоста.

EDIT:

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

2 голосов
/ 02 октября 2012

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

0 голосов
/ 20 июля 2010

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

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

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

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

...