¿Cuál es la forma de imprimir las rutas de búsqueda que buscó ld en el orden en que busca?
153
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).
/usr/local/..
que se produce un error de biblioteca faltante y la vinculación falla. Tengo que cambiar el nombre/usr/local
cada vez para excluir esa ruta de búsqueda. ¿Hay una manera simple de excluir o anular la/usr/local
ruta?ld
la ruta de búsqueda de s. Por ejemplo, a veces tengo que compilar un código fuentemakefile
o generar un archivo MAKE a partir de unconfigure
script o de unoCMakeLists.txt
aún más complicado comovala
osrt
. Es difícil para mí modificar lald
ruta de búsqueda en tales casosEn Linux, puede usar
ldconfig
, que mantiene la configuración y caché de ld.so, para imprimir los directorios de búsquedald.so
conldconfig -v
imprime 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); elgrep
obtiene los directorios. En mi máquina, esta línea se imprimeLas primeras rutas, sin
hwcap
en 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 lossse2
correspondientes a capacidades adicionales de la CPU. Estas rutas, conhwcap
en la línea, pueden contener bibliotecas adicionales adaptadas para estas capacidades de CPU.Una nota final: usar en
-p
lugar de lo-v
anterior busca en elld.so
caché.fuente
export LD_LIBRARY_PATH=/some/other/dir
, no afectará la salida de este comando? Parece que no funciona al 100%?LD_LIBRARY_PATH
al permitir la depuración. Por ejemploLD_DEBUG=libs /lib/ld-linux.so --list cat
(puede usar cualquier ejecutable, elegícat
lo primero que se me ocurrió). Podría valer la pena "search path
". Tenga en cuenta que si tiene una/etc/ld.so.cache
que coincide con todas las bibliotecas necesarias, no podrá ver la ruta de búsqueda del sistema incorporado, porque no llegará tan lejos.gcc
ruta de búsqueda es la misma con estos?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
-L
opciones en la línea de comando, seguidos por directorios agregados a la ruta de búsqueda porSEARCH_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
ld
directamente:-L
opciones son lo que haya dicho que son.--verbose
opción. Busque lasSEARCH_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 deld
: 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
:-v
opción agcc
para que le muestre cómo invoca el vinculador. De hecho, normalmente no invocald
directamente, sino indirectamente a través de una herramienta llamadacollect2
(que vive en uno de sus directorios internos), que a su vez invocald
. Eso le mostrará qué-L
opciones se están utilizando.-Wl,--verbose
a lasgcc
opciones para que pase--verbose
al enlazador, para ver el script del enlazador como se describió anteriormente.fuente
-T script
mi script reemplazó por completo el script predeterminado de ld y solo miré donde señalé.El comando más compatible que he encontrado para gcc y clang en Linux (gracias a armando.sano):
si da
-m32
, generará los directorios correctos de la biblioteca.Ejemplos en mi máquina:
para
g++ -m64
:para
g++ -m32
:fuente
La pregunta está etiquetada Linux, pero ¿tal vez esto funciona tan bien en Linux?
En Mac OS X, esto imprime:
La
-Xlinker
opción degcc
arriba solo pasa-v
ald
. Sin embargo:no imprime la ruta de búsqueda.
fuente
-Lpath
. Entonces la respuesta de @ Raphaël Londeix es mejor.Versión para Mac: $ ld -v 2, no sé cómo obtener rutas detalladas. salida
fuente
ld -v 2
ld
. La gente de Binutil lo deshabilitó en los scripts de compilación. Ha sido deshabilitado por años.