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

#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 запрашивает о библиотеках, которые фактически используются (не просто загружаются).