
Есть ли встроенная функция GNU Linux для получения списка имен файлов общих библиотек? Я рассматривал возможность анализа вывода ldconfig -p
. Однако я не уверен в согласованности вывода от системы к системе.
Я уже знаю, что я мог бы использовать, find
но учитывая, что у компоновщика/загрузчика есть кэш библиотек и местоположений, кажется более эффективным использовать его каким-то образом. Кроме того, меня интересуют только пути, которые ищет компоновщик/загрузчик, то есть библиотеки, которые были обработаны ldconfig
.
решение1
Если вы хотите перехватить их все, нет другого выбора, кроме как выполнить полный обход файловой системы. ldconfig
знает только о библиотеках в стандартных путях и дополнительных путях, на просмотр которых он настроен (обычно определяется в /etc/ld.so.conf*
). Обычные подозрительные места, где можно найти другие библиотеки, это $HOME
и /opt
, хотя ограничений нет, особенно когда люди сами создают приложения.
Если вы не доверяете выходным данным ldconfig -p
, вы можете проанализировать его кэш напрямую. Он двоичный, но использование strings
удаляет весь мусор (5, поэтому /lib/ соответствует):
strings -n5 /etc/ld.so.cache
В моей системе они оба дают одинаковые результаты, что я быстро проверил:
a=$(ldconfig -p | awk -F'> ' '{print $2}' | sort); # get them to the same format
b=$(strings -n5 /etc/ld.so.cache | sort -u);
echo -e "$a\n$b\n$b" | sort | uniq -u
Который проверил, ldconfig -p
не упоминается ли какая-либо библиотека из списка в кэше. Ничего не было возвращено.