#linux #shared-libraries
#linux #разделяемые библиотеки
Вопрос:
У меня есть исполняемый файл, и я хотел бы выяснить, какие разделяемые библиотеки фактически использовались во время определенного запуска. Я знаю, что ldd перечислил бы все зависимости от разделяемой библиотеки этого исполняемого файла, но я хотел бы узнать подмножество тех, которые фактически использовались во время определенного запуска *. Возможно ли это?
* что я имею в виду под конкретным запуском, так это запуск исполняемого файла с определенными входными параметрами, которые привели бы к запуску только небольшой части кода.
Комментарии:
1.
part of the code to be run.
подождите. Вы говорите о программе, создающейdlopen
разделяемую библиотеку самостоятельно вместо компоновщика, или вас интересует график вызовов библиотеки, где каждая функция привязана к своему источнику в разделяемой библиотеке?2. Пример того, что я хочу, следующий: допустим, моя программа выполняет следующее: Если входное значение равно 1, вызовите функцию A, которая находится в разделяемой библиотеке a.so и если входные данные равны 2, вызовите функцию B, которая находится в разделяемой библиотеке b.so. Я хотел бы запустить программу с вводом 2 и каким-то образом получить информацию, которая b.so использовалось. На первый взгляд я думаю, что ответ Дэниела сделал бы это.
Ответ №1:
Вы можете использовать ltrace(1)
для этого:
$ PROG='ls -l'
# Collect call info
$ ltrace -o calls.txt -l '*' $PROG amp;> /dev/null
# Analyze collected data
$ cat calls.txt | sed -ne '/->/{ s/^(.*)->.*/1/; p }' | sort -u
libacl.so.1
libcap.so.2
libc.so.6
libselinux.so.1
ls
# Compare with ldd
$ ldd /bin/ls | wc -l
10
Ответ №2:
Вы могли бы использовать strace
и grep для открытых файлов .so.
strace $MYPROG | grep -E '^open*.so
lsof
также должен работать grep для открытых библиотек.
lsof -p $PID | awk '{print $9}' | grep '.so'
Предполагается, что разделяемые библиотеки имеют расширение .so
Комментарии:
1. OP запрашивает о библиотеках, которые фактически используются (не просто загружаются).