Как распечатать пути поиска, которые просматривал ld в порядке поиска.
Как распечатать пути поиска, которые просматривал ld в порядке поиска.
Ответы:
Вы можете сделать это, выполнив следующую команду:
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 (т. Е. Всякий раз, когда программа связана).
ld
пути поиска. Например, иногда мне приходится компилировать исходный код из makefile
или генерировать make-файл из configure
скрипта или из CMakeLists.txt
или даже более сложных, таких как vala
или srt
. В ld
таких случаях мне сложно изменить путь поиска
В Linux вы можете использовать ldconfig
, который поддерживает конфигурацию и кеш ld.so, для распечатки поиска по каталогам с ld.so
помощью
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v
распечатывает поиск по каталогам с помощью компоновщика (без ведущей вкладки) и общих библиотек, найденных в этих каталогах (с ведущей вкладкой); grep
получает каталоги. На моей машине эта строка распечатывается
/usr/lib64/atlas:
/usr/lib/llvm:
/usr/lib64/llvm:
/usr/lib64/mysql:
/usr/lib64/nvidia:
/usr/lib64/tracker-0.12:
/usr/lib/wine:
/usr/lib64/wine:
/usr/lib64/xulrunner-2:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/usr/lib64/nvidia/tls: (hwcap: 0x8000000000000000)
/lib/i686: (hwcap: 0x0008000000000000)
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib/sse2: (hwcap: 0x0000000004000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)
Первые пути без 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):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
если вы дадите -m32
, он выведет правильные каталоги библиотеки.
Примеры на моей машине:
для g++ -m64
:
/usr/x86_64-linux-gnu/lib64
/usr/i686-linux-gnu/lib64
/usr/local/lib/x86_64-linux-gnu
/usr/local/lib64
/lib/x86_64-linux-gnu
/lib64
/usr/lib/x86_64-linux-gnu
/usr/lib64
/usr/local/lib
/lib
/usr/lib
для g++ -m32
:
/usr/i686-linux-gnu/lib32
/usr/local/lib32
/lib32
/usr/lib32
/usr/local/lib/i386-linux-gnu
/usr/local/lib
/lib/i386-linux-gnu
/lib
/usr/lib/i386-linux-gnu
/usr/lib
Вопрос помечен Linux, но, может быть, это работает под Linux?
gcc -Xlinker -v
Под Mac OS X это печатает:
@(#)PROGRAM:ld PROJECT:ld64-224.1
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 armv6m armv7m armv7em
Library search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib
Framework search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/
[...]
-Xlinker
Вариант gcc
выше просто переходит -v
к ld
. Тем не мение:
ld -v
не печатает путь поиска.
-Lpath
. Так что @ Raphaël Londeix ответ лучше.
Версия для Mac: $ ld -v 2, не знаю, как получить подробные пути. вывод
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
ld
. Люди Binutil отключили его в сценариях сборки. Это было отключено в течение многих лет.
/usr/local/..
чего отсутствует ошибка библиотеки, и при линковке происходит сбой. Я должен переименовывать/usr/local
каждый раз, чтобы исключить этот путь поиска. Есть ли простой способ исключить или переопределить/usr/local
путь?