Каким образом печатаются пути поиска, которые выглядят в ld в порядке, в котором он выполняется.
Как распечатать путь поиска ld (linker)
Ответ 1
В 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
в строке могут содержать дополнительные библиотеки, предназначенные для этих возможностей ЦП.
Последнее замечание: вместо -v
вместо -v
вместо -v
выполняется поиск в кэше ld.so
.
Ответ 2
Я не уверен, что есть возможность просто распечатать полный эффективный путь поиска.
Но: путь поиска состоит из каталогов, указанных в параметрах -L
в командной строке, за которыми следуют каталоги, добавленные в путь поиска директивами SEARCH_DIR("...")
в компоновщике script (s). Таким образом, вы можете это обработать, если вы можете увидеть оба из них, которые вы можете сделать следующим образом:
Если вы вызываете ld
напрямую:
- Параметры
-L
- это то, что вы сказали. - Чтобы увидеть компоновщик script, добавьте параметр
--verbose
. Ищите директивыSEARCH_DIR("...")
, обычно около верхней части вывода. (Обратите внимание, что это не обязательно одно и то же для каждого вызоваld
- у компоновщика есть несколько различных встроенных сценариев компоновщика по умолчанию и выбирается между ними на основе различных других вариантов компоновщика.)
Если вы связываетесь через gcc
:
- Вы можете передать параметр
-v
наgcc
, чтобы он показывал вам, как он вызывает компоновщик. Фактически, он обычно не вызываетld
напрямую, а косвенно через инструмент под названиемcollect2
(который живет в одном из своих внутренних каталогов), который, в свою очередь, вызываетld
. Это покажет вам, какие опции-L
используются. - Вы можете добавить
-Wl,--verbose
в параметрыgcc
, чтобы передать его--verbose
в компоновщик, чтобы увидеть компоновщик script, как описано выше.
Ответ 3
Вы можете сделать это, выполнив следующую команду:
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 (т.е. всякий раз, когда программа связана).
Ответ 4
Самая совместимая команда, которую я нашел для 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
Ответ 5
Вопрос помечен как 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
не печатает путь поиска.
Ответ 6
Версия для Mac: $ld -v 2, не знаю, как получить подробные пути. выход
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/