Как напечатать путь поиска ld (linker) - PullRequest
134 голосов
/ 29 марта 2012

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

Ответы [ 6 ]

78 голосов
/ 10 мая 2012

В 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.

73 голосов
/ 06 февраля 2014

Вы можете сделать это, выполнив следующую команду:

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 (т. Е. Всякий раз, когда программа связана).

64 голосов
/ 29 марта 2012

Я не уверен, что можно просто напечатать полный эффективный путь поиска.

Но: путь поиска состоит из каталогов, заданных опциями -L в командной строке, за которыми следуют каталоги, добавленные к пути поиска директивами SEARCH_DIR("...") в сценариях компоновщика. Таким образом, вы можете решить это, если вы можете увидеть оба из них, что вы можете сделать следующим образом:

Если вы вызываете ld напрямую:

  • Опции -L - это то, что вы сказали.
  • Чтобы увидеть скрипт компоновщика, добавьте параметр --verbose. Ищите директивы SEARCH_DIR("..."), обычно в верхней части вывода. (Обратите внимание, что они не обязательно одинаковы для каждого вызова ld - компоновщик имеет ряд различных встроенных сценариев компоновщика по умолчанию и выбирает между ними на основе различных других параметров компоновщика.)

Если вы подключаетесь через gcc:

  • Вы можете передать параметр -v в gcc, чтобы он показал вам, как он вызывает компоновщик. Фактически, он обычно не вызывает ld напрямую, а косвенно через инструмент под названием collect2 (который находится в одном из своих внутренних каталогов), который, в свою очередь, вызывает ld. Это покажет вам, какие параметры -L используются.
  • Вы можете добавить -Wl,--verbose к опциям gcc, чтобы он передавал --verbose компоновщику, чтобы увидеть скрипт компоновщика, как описано выше.
24 голосов
/ 09 апреля 2015

Самая совместимая команда, которую я нашел для 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 голосов
/ 15 декабря 2014

Вопрос помечен 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/
[...]

Опция -Xlinkergcc выше просто передает -v в ld.Однако:

ld -v

не печатает путь поиска.

1 голос
/ 14 января 2016

Версия для Mac: $ ld -v 2, не знаю, как получить подробные пути.вывод

Library search paths:
    /usr/lib
    /usr/local/lib
Framework search paths:
    /Library/Frameworks/
    /System/Library/Frameworks/
...