¿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/localcada vez para excluir esa ruta de búsqueda. ¿Hay una manera simple de excluir o anular la/usr/localruta?ldla ruta de búsqueda de s. Por ejemplo, a veces tengo que compilar un código fuentemakefileo generar un archivo MAKE a partir de unconfigurescript o de unoCMakeLists.txtaún más complicado comovalaosrt. Es difícil para mí modificar laldruta 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.soconldconfig -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); elgrepobtiene los directorios. En mi máquina, esta línea se imprimeLas 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 lossse2correspondientes a capacidades adicionales de la CPU. Estas rutas, conhwcapen la línea, pueden contener bibliotecas adicionales adaptadas para estas capacidades de CPU.Una nota final: usar en
-plugar de lo-vanterior busca en elld.socaché.fuente
export LD_LIBRARY_PATH=/some/other/dir, no afectará la salida de este comando? Parece que no funciona al 100%?LD_LIBRARY_PATHal permitir la depuración. Por ejemploLD_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.gccruta 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
-Lopciones 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
lddirectamente:-Lopciones son lo que haya dicho que son.--verboseopció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:-vopción agccpara que le muestre cómo invoca el vinculador. De hecho, normalmente no invocalddirectamente, 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é-Lopciones se están utilizando.-Wl,--verbosea lasgccopciones para que pase--verboseal enlazador, para ver el script del enlazador como se describió anteriormente.fuente
-T scriptmi 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
-Xlinkeropción degccarriba solo pasa-vald. 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 2ld. La gente de Binutil lo deshabilitó en los scripts de compilación. Ha sido deshabilitado por años.