it-swarm-es.tech

Cómo imprimir la ruta de búsqueda de ld (enlazador)

¿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?.

133
Talespin_Kit

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.

77
telotortium

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

72
faken

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:

  • Las opciones -L son lo que usted ha dicho que son.
  • Para ver la secuencia de comandos del vinculador, agregue la opción --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:

  • Puede pasar la opción -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.
  • Puede agregar -Wl,--verbose a las opciones gcc para hacer que pase --verbose al vinculador, para ver el script del vinculador como se describe anteriormente.
63
Matthew Slattery

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
23
Raphaël Londeix

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.

5
armando.sano

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/
1
yfeleke