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


153

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

Respuestas:


95

Puede hacer esto ejecutando el siguiente comando:

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

gcc pasa algunas rutas -L adicionales 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 usar ld.so.conf y ldconfig no son correctas porque se refieren a las rutas buscadas por el enlazador dinámico de tiempo de ejecución (es decir, cada vez que se ejecuta un programa), que no es lo mismo que la ruta buscada por ld (es decir, cuando un programa está vinculado).


2
Has dado en el clavo. Tengo un problema de vinculación, durante el proceso de vinculación, el vinculador encuentra bibliotecas instaladas manualmente en las /usr/local/..que se produce un error de biblioteca faltante y la vinculación falla. Tengo que cambiar el nombre /usr/localcada vez para excluir esa ruta de búsqueda. ¿Hay una manera simple de excluir o anular la /usr/localruta?
kenn

1
Puede intentar especificar manualmente las rutas de la biblioteca con la opción -L a GCC, que creo (no estoy seguro) anulará las rutas de la biblioteca del sistema. También puede intentar configurar la variable env LIBRARY_PATH antes de compilar: $ LIBRARY_PATH = / somedir / gcc ...
falso

1
Sé que la vinculación en la línea de comandos de compilación. Me refería a una forma global de anular ldla ruta de búsqueda de s. Por ejemplo, a veces tengo que compilar un código fuente makefileo generar un archivo MAKE a partir de un configurescript o de uno CMakeLists.txtaún más complicado como valao srt. Es difícil para mí modificar la ldruta de búsqueda en tales casos
kenn

Al usar CMake, puede seleccionar las bibliotecas exactas que se usan durante la fase de configuración (algunas de estas entradas se muestran solo en modo avanzado). En cuanto a las secuencias de comandos de configuración de Autotools, consulte esta respuesta: stackoverflow.com/questions/7561509/… . Esto no responde su pregunta directamente, pero puede ayudarlo a hacer lo que quiere.
falso el

81

En Linux, puede usar ldconfig, que mantiene la configuración y caché de ld.so, para imprimir los directorios de búsqueda ld.socon

ldconfig -v 2>/dev/null | grep -v ^$'\t'

ldconfig -vimprime la búsqueda de directorios por el enlazador (sin una pestaña principal) y las bibliotecas compartidas que se encuentran en esos directorios (con una pestaña principal); el grepobtiene 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 hwcapen la línea, están integradas o se leen desde /etc/ld.so.conf. El enlazador puede buscar directorios adicionales en la ruta de búsqueda básica de la biblioteca, con nombres como los sse2correspondientes a capacidades adicionales de la CPU. Estas rutas, con hwcapen la línea, pueden contener bibliotecas adicionales adaptadas para estas capacidades de CPU.

Una nota final: usar en -plugar de lo -vanterior busca en el ld.socaché.


51
¡Está preguntando sobre el enlazador (ld) y no sobre el cargador (ld.so)!
fons

3
¿Cómo es posible que si configuro export LD_LIBRARY_PATH=/some/other/dir, no afectará la salida de este comando? Parece que no funciona al 100%?
TMS

3
@fons Lo curioso es que llegué aquí buscando esta respuesta. :) ruta de enlace o tiempo de ejecución? Supongo que esa es la pregunta. LIBRAY_PATH (tiempo de enlace) vs LD_LIBRARY_PATH.
Daniel Santos

2
En algunas plataformas (p. Ej., Armado con la cadena de herramientas Linaro) he descubierto que ldconfig no busca realmente los mismos directorios que el enlazador de tiempo de ejecución. Usted puede conseguir que la salida de su ruta de búsqueda, e incluyen los caminos de LD_LIBRARY_PATHal permitir la depuración. Por ejemplo LD_DEBUG=libs /lib/ld-linux.so --list cat(puede usar cualquier ejecutable, elegí catlo primero que se me ocurrió). Podría valer la pena " search path". Tenga en cuenta que si tiene una /etc/ld.so.cacheque coincide con todas las bibliotecas necesarias, no podrá ver la ruta de búsqueda del sistema incorporado, porque no llegará tan lejos.
John O'M.

¿La gccruta de búsqueda es la misma con estos?
nn0p

67

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 consiste en directorios especificados por -Lopciones en la línea de comando, seguidos por directorios agregados a la ruta de búsqueda por SEARCH_DIR("...")directivas en los scripts del enlazador. Entonces puede resolverlo si puede ver ambos, lo que puede hacer de la siguiente manera:

Si estás invocando lddirectamente:

  • Las -Lopciones son lo que haya dicho que son.
  • Para ver la secuencia de comandos del vinculador, agregue la --verboseopción. Busque las SEARCH_DIR("...")directivas, 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 varios scripts de vinculador predeterminados integrados diferentes y elige entre ellos en función de otras opciones de vinculador).

Si está vinculando a través de gcc:

  • Puede pasar la -vopción a gccpara que le muestre cómo invoca el vinculador. De hecho, normalmente no invoca lddirectamente, 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é -Lopciones se están utilizando.
  • Puede agregar -Wl,--verbosea las gccopciones para que pase --verboseal enlazador, para ver el script del enlazador como se describió anteriormente.

55
La opción --verbose para el enlazador hizo el truco. ¡Muy útil!
Ari

Estaba intentando averiguar dónde estaba buscando el enlazador y no encontré SEARCH_DIR en la salida. Resulta que cuando estaba usando -T scriptmi script reemplazó por completo el script predeterminado de ld y solo miré donde señalé.
thomasa88 01 de

29

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 da -m32, generará 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

¡Gracias! mejora adolescente: deshacerse de un grep o dos: sed -n 's / SEARCH_DIR ("= \? ([^"] \ +) "); * / \ 1 \ n / gp'
Bruce K

2
¿Por qué esto requiere un método tan oscuro?
bmacnaughton

Funcionó como por arte de magia ! ¿Cómo agregamos los directorios en esta lista, ruta de búsqueda del enlazador?
pari

6

La pregunta está etiquetada Linux, pero ¿tal vez esto funciona tan bien 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 -Xlinkeropción de gccarriba solo pasa -va ld. Sin embargo:

ld -v

no imprime la ruta de búsqueda.


En Linux también imprime directorios, pero en forma de -Lpath. Entonces la respuesta de @ Raphaël Londeix es mejor.
pevik

2

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/

3
Me sale "no se puede abrir 2: no existe tal archivo o directorio". Correrld -v 2
Jack

2
La pregunta está etiquetada con Linux, no con OS X. No creo que OS X use GNU ld. La gente de Binutil lo deshabilitó en los scripts de compilación. Ha sido deshabilitado por años.
jww
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.