gcc ld rpath

gcc - No entiendo-Wl,-rpath-Wl,



ld (4)

Para mayor comodidad, agregué las páginas de manual relevantes a continuación.

Mi (mal) entendimiento primero: si necesito separar las opciones con -Wl eso significa que el segundo -Wl no es otra opción porque viene antes , que significa que es un argumento para la opción -rpath .

No entiendo cómo -rpath puede tener un -Wl,. ¡argumento!

Lo que tendría sentido en mi mente sería este:

-Wl,-rpath .

Esto debería invocar la opción del vinculador de ruta con el argumento del directorio actual.

hombre gcc:

-Wl, opción

Pase la opción como una opción al vinculador. Si la opción contiene comas, se divide en múltiples opciones en las comas. Puede usar esta sintaxis para pasar un argumento a la opción. Por ejemplo, -Wl,-Map,output.map pasa -Map output.map al enlazador. Cuando usa el enlazador GNU, también puede obtener el mismo efecto con `-Wl, -Map = output.map ''.

hombre ld:

-ruta = dir

Agregue un directorio a la ruta de búsqueda de la biblioteca de tiempo de ejecución. Esto se usa cuando se vincula un ejecutable ELF con objetos compartidos. Todos los argumentos de ruta se concatenan y se pasan al enlazador en tiempo de ejecución, que los usa para localizar objetos compartidos en tiempo de ejecución. La opción -rpath también se usa cuando se ubican objetos compartidos que son necesarios para objetos compartidos incluidos explícitamente en el enlace;


La opción -Wl,xxx para gcc pasa una lista de tokens separados por comas como una lista de argumentos separados por espacios para el vinculador . Asi que

gcc -Wl,aaa,bbb,ccc

finalmente se convierte en una llamada de enlazador

ld aaa bbb ccc

En su caso, quiere decir " ld -rpath . ", por lo que pasa esto a gcc como -Wl,-rpath,. Alternativamente, puede especificar instancias repetidas de -Wl :

gcc -Wl,aaa -Wl,bbb -Wl,ccc

Tenga en cuenta que no hay coma entre aaa y el segundo -Wl .

O, en su caso, -Wl,-rpath -Wl,. .


La página man lo deja bastante claro. Si desea pasar dos argumentos ( -rpath y . ) Al enlazador, puede escribir

-Wl,-rpath,.

o alternativamente

-Wl,-rpath -Wl,.

Los argumentos -Wl,-rpath . sugirió que NO tiene sentido para mi mente. ¿Cómo se supone que gcc debe saber que se supone que su segundo argumento ( . ) Se pasa al enlazador en lugar de interpretarse normalmente? La única forma en que podría saber eso es si tenía conocimiento interno de todos los posibles argumentos del enlazador, por lo que sabía que -rpath requería un argumento después de él.


Otra cosa. Es posible que deba especificar la opción -L también , por ejemplo

-Wl,-rpath,/path/to/foo -L/path/to/foo -lbaz

o puede terminar con un error como

ld: cannot find -lbaz


También puedes escribir

-Wl,-rpath=.

Para deshacerse de ese espacio molesto. Es posiblemente más legible que agregar comas adicionales (es exactamente lo que pasa a ld).