Как распечатать пути поиска, которые просматривал ld в порядке поиска.
154
Вы можете сделать это, выполнив следующую команду:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc передает компоновщику несколько дополнительных путей -L, которые вы можете перечислить с помощью следующей команды:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
Ответы, предлагающие использовать ld.so.conf и ldconfig, не являются правильными, потому что они ссылаются на пути, которые ищет динамический компоновщик времени выполнения (т. Е. Всякий раз, когда выполняется программа), который не совпадает с путем, ищущим ld (т. Е. Всякий раз, когда программа связана).
/usr/local/..
чего отсутствует ошибка библиотеки, и при линковке происходит сбой. Я должен переименовывать/usr/local
каждый раз, чтобы исключить этот путь поиска. Есть ли простой способ исключить или переопределить/usr/local
путь?ld
пути поиска. Например, иногда мне приходится компилировать исходный код изmakefile
или генерировать make-файл изconfigure
скрипта или изCMakeLists.txt
или даже более сложных, таких какvala
илиsrt
. Вld
таких случаях мне сложно изменить путь поискаВ Linux вы можете использовать
ldconfig
, который поддерживает конфигурацию и кеш ld.so, для распечатки поиска по каталогам сld.so
помощьюldconfig -v
распечатывает поиск по каталогам с помощью компоновщика (без ведущей вкладки) и общих библиотек, найденных в этих каталогах (с ведущей вкладкой);grep
получает каталоги. На моей машине эта строка распечатываетсяПервые пути без
hwcap
строки либо встроены, либо читаются из /etc/ld.so.conf. Затем компоновщик может искать дополнительные каталоги по основному пути поиска в библиотеке, имена которыхsse2
соответствуют дополнительным возможностям ЦП. Эти путиhwcap
в строке могут содержать дополнительные библиотеки, специально предназначенные для этих возможностей ЦП.И последнее замечание:
-p
вместо этого используется-v
поиск вld.so
кеше.источник
export LD_LIBRARY_PATH=/some/other/dir
, это не повлияет на вывод этой команды ?! Кажется, это не работает на 100%?LD_LIBRARY_PATH
, включив отладку. НапримерLD_DEBUG=libs /lib/ld-linux.so --list cat
(вы можете использовать любой исполняемый файл, который я выбралcat
первым, о чем я мог подумать). Может быть стоит потрогать за "search path
". Обратите внимание, что если у вас есть/etc/ld.so.cache
файл, который соответствует всем необходимым библиотекам, вы не увидите путь поиска встроенной системы, потому что он далеко не уйдет.gcc
Одинаков ли путь поиска с этими?Я не уверен, что есть какая-либо опция для простой печати полного эффективного пути поиска.
Но: путь поиска состоит из каталогов, заданных
-L
параметрами в командной строке, за которыми следуют каталоги, добавленные к пути поискаSEARCH_DIR("...")
директивами в сценариях компоновщика. Таким образом, вы можете решить это, если вы можете увидеть оба из них, что вы можете сделать следующим образом:Если вы вызываете
ld
напрямую:-L
варианты , что вы сказали они.--verbose
опцию. ИщитеSEARCH_DIR("...")
директивы, обычно в верхней части вывода. (Обратите внимание, что они не обязательно одинаковы для каждого вызоваld
- компоновщик имеет несколько различных встроенных скриптов компоновщика по умолчанию и выбирает между ними на основе различных других параметров компоновщика.)Если вы делаете ссылку через
gcc
:-v
параметр, чтобыgcc
он показал вам, как он вызывает компоновщик. Фактически, он обычно вызывается неld
напрямую, а косвенно через инструмент под названиемcollect2
(который находится в одном из своих внутренних каталогов), который, в свою очередь, вызываетld
. Это покажет вам, какие-L
параметры используются.-Wl,--verbose
кgcc
опциям, чтобы он проходил--verbose
через компоновщик, чтобы увидеть скрипт компоновщика, как описано выше.источник
-T script
свой скрипт, он полностью заменил скрипт ld по умолчанию и смотрел только туда, куда я указал.Наиболее совместимая команда, которую я нашел для gcc и clang в Linux (спасибо armando.sano):
если вы дадите
-m32
, он выведет правильные каталоги библиотеки.Примеры на моей машине:
для
g++ -m64
:для
g++ -m32
:источник
Вопрос помечен Linux, но, может быть, это работает под Linux?
Под Mac OS X это печатает:
-Xlinker
Вариантgcc
выше просто переходит-v
кld
. Тем не мение:не печатает путь поиска.
источник
-Lpath
. Так что @ Raphaël Londeix ответ лучше.Версия для Mac: $ ld -v 2, не знаю, как получить подробные пути. вывод
источник
ld -v 2
ld
. Люди Binutil отключили его в сценариях сборки. Это было отключено в течение многих лет.