Как распечатать путь поиска ld (linker)

Каким образом печатаются пути поиска, которые выглядят в ld в порядке, в котором он выполняется.

Ответ 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/