Подтвердить что ты не робот

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

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

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

Например:

gdb path/to/executable path/to/corefile

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

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

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

4b9b3361

Ответ 1

Запустите 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.

Ответ 2

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

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

ldd path/to/executable

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

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

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

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

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

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

man ld.so

Ответ 3

Я нашел эту выдержку на 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-pre-to-to-fog и добавление каталогов в пути solib-поиска в том порядке, в котором я нуждаюсь, может быть полным решением.

Ответ 4

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

Ответ 5

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

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

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

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