Мой ответ немного грязный, извините за это.Я почти уверен, что есть лучшее решение, но оно, тем не менее, должно помочь.
Во время компоновки AFAIK компоновщик ищет все пути к библиотекам, о которых он знает, и ищет имя библиотеки, зависящее от архива, в Linux "-Я foo "будет искать" libfoo.so ", на Mac" libfoo.dylib ".Теперь, если вы посмотрите, например, в / usr / lib, вы заметите, что есть много символических ссылок.Например, если у вас есть libfoo.so.1.2.3, там также должны быть символические ссылки libfoo.so.1.2 -> libfoo.so.1.2.3, libfoo.so.1 -> libfoo.so.1.2 и libfoo.so -> libfoo.so.1.Идея заключается в поддержке различных версий.Поэтому, если вам нужно знать, какой файл используется, я предлагаю вам сделать это:
Добавьте «-v» к своим LDFLAGS или непосредственно к вашему вызову gcc.Это приведет к шумному выводу gcc, интересным является вызов «collect2».Он имеет различные аргументы -L ... и это каталоги, которые компоновщик ищет в библиотеках.Вы также увидите -l ... (строчные буквы).Вам нужно заглянуть в каталоги -L для библиотек, указанных в -l, и следовать их символическим ссылкам.
Если вам нужно знать, какая библиотека используется во время выполнения: это намного проще.Просто запустите ldd some_program
, он скажет вам, какие библиотеки используются.Он на самом деле вызывает программу, так что динамический компоновщик запускается, но передает переменную окружения, которая заставляет компоновщик распечатать то, что он загрузил, и выйти из программы, даже не запустив ее.На Mac используйте otool -L some_program
.
. Для работающей программы вам нужно узнать PID программы.Тогда сделай cat /proc/pid_of_program/maps
.Это дает вам карту памяти.Интересной частью является правая колонка, в которой перечислены загруженные библиотеки (потому что они попадают в процесс mmap).Я не знаю эквивалента для этого на Mac.