¿Cuál es la forma de imprimir las rutas de búsqueda que se han buscado por ld en el orden en que se buscan?.
En Linux, puede usar ldconfig
, que mantiene la configuración y el caché de ld.so, para imprimir la búsqueda de directorios por ld.so
con
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v
imprime la búsqueda de directorios por el vinculador (sin una pestaña de inicio) y las bibliotecas compartidas que se encuentran en esos directorios (con una pestaña de inicio); La grep
obtiene los directorios. En mi máquina, esta línea se imprime.
/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)
Las primeras rutas, sin hwcap
en la línea, están integradas o leídas desde /etc/ld.so.conf. El enlazador puede buscar directorios adicionales en la ruta de búsqueda de la biblioteca básica, con nombres como sse2
que corresponden a las capacidades adicionales de la CPU. Estas rutas, con hwcap
en la línea, pueden contener bibliotecas adicionales diseñadas para estas capacidades de CPU.
Una nota final: el uso de -p
en lugar de -v
anterior busca la caché ld.so
en su lugar.
Puedes hacer esto ejecutando el siguiente comando:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc pasa algunas rutas extra -L al vinculador, que puede enumerar con el siguiente comando:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
Las respuestas que sugieren utilizar ld.so.conf y ldconfig no son correctas porque se refieren a las rutas buscadas por el enlazador dinámico en tiempo de ejecución (es decir, cuando se ejecuta un programa), que no es la misma que la ruta buscada por ld (es decir, cuando un programa está vinculado).
No estoy seguro de que haya alguna opción para imprimir simplemente la ruta de búsqueda efectiva completa.
Pero: la ruta de búsqueda consiste en directorios especificados por las opciones de -L
en la línea de comandos, seguidos por los directorios agregados a la ruta de búsqueda por las directivas de SEARCH_DIR("...")
en los scripts del vinculador. Así que puedes resolverlo si puedes ver ambos, lo que puedes hacer de la siguiente manera:
Si estás invocando directamente a ld
:
-L
son lo que usted ha dicho que son.--verbose
. Busque las directivas SEARCH_DIR("...")
, generalmente cerca de la parte superior de la salida. (Tenga en cuenta que estos no son necesariamente los mismos para cada invocación de ld
- el vinculador tiene una cantidad de diferentes scripts de vinculador predeterminados incorporados, y elige entre ellos en función de varias otras opciones de vinculador).Si estás enlazando a través de gcc
:
-v
a gcc
para que le muestre cómo invoca al enlazador. De hecho, normalmente no invoca directamente a ld
, sino indirectamente a través de una herramienta llamada collect2
(que vive en uno de sus directorios internos), que a su vez invoca a ld
. Eso le mostrará qué opciones de -L
se están utilizando.-Wl,--verbose
a las opciones gcc
para hacer que pase --verbose
al vinculador, para ver el script del vinculador como se describe anteriormente.El comando más compatible que he encontrado para gcc y clang en Linux (gracias a armando.sano):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
si le da -m32
, generará los directorios de la biblioteca correctos.
Ejemplos en mi máquina:
para 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
para 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
La pregunta está etiquetada como Linux, pero ¿quizás esto también funcione en Linux?
gcc -Xlinker -v
Bajo Mac OS X, esto imprime:
@(#)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/
[...]
La opción -Xlinker
de gcc
anterior simplemente pasa -v
a ld
. Sin embargo:
ld -v
no imprime la ruta de búsqueda.
Versión para Mac: $ ld -v 2, no sé cómo obtener rutas detalladas. salida
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/