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

¿Cuál es la manera de imprimir las rutas de búsqueda que miró por ld en el orden en que busca?

En Linux, puede usar ldconfig , que mantiene la configuración ld.so y el caché, 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 ldconfig -v ) y las bibliotecas compartidas que se encuentran en esos directorios (con una pestaña principal); el 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 incorporadas o leídas de /etc/ld.so.conf. El vinculador puede buscar directorios adicionales en la ruta de búsqueda de la biblioteca básica, con nombres como sse2 correspondientes a capacidades de CPU adicionales. Estas rutas, con hwcap en la línea, pueden contener bibliotecas adicionales adaptadas para estas capacidades de CPU.

Una nota final: el uso de -p lugar de -v arriba busca en ld.so caché ld.so

No estoy seguro de que haya alguna opción para simplemente imprimir la ruta de búsqueda efectiva completa.

Pero: la ruta de búsqueda consta de directorios especificados por las opciones -L en la línea de comandos, seguidos por los directorios agregados a la ruta de búsqueda por las SEARCH_DIR("...") en las secuencias de comandos del enlazador. Entonces puede resolverlo si puede ver ambos, lo cual puede hacer de la siguiente manera:

Si está invocando ld directamente:

  • Las opciones -L son lo que sea que hayas dicho que son.
  • Para ver el script del enlazador, agregue la opción --verbose . Busque las 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 enlazador tiene varios scripts de enlazador por defecto diferentes y elige entre ellos en función de otras opciones de enlazador).

Si está enlazando a través de gcc :

  • Puede pasar la opción -v a gcc para que le muestre cómo invoca el vinculador. De hecho, normalmente no invoca ld directamente, sino indirectamente a través de una herramienta llamada collect2 (que vive en uno de sus directorios internos), que a su vez invoca ld . Eso le mostrará qué opciones de -L están siendo utilizadas.
  • Puede agregar -Wl,--verbose a las opciones de gcc para hacer que pase --verbose través del enlazador, para ver el script del enlazador como se describe arriba.

Puede hacer esto ejecutando el siguiente comando:

 ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012 

gcc pasa algunas rutas extra-L al enlazador, 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 dynamic en tiempo de ejecución (es decir, cada vez que se ejecuta un progtwig), que no es lo mismo que la ruta buscada por ld (es decir, siempre un progtwig está vinculado).

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 das -m32 , dará salida a los directorios correctos de la biblioteca.

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 funcione también en Linux?

 gcc -Xlinker -v 

En 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 arriba simplemente pasa -v a ld . Sin embargo:

 ld -v 

no imprime la ruta de búsqueda.

Versión de 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/