No entiendo -Wl, -rpath -Wl,

244

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

Mi (mal) entendimiento primero: si necesito separar las opciones con ,, eso significa que la segunda -Wlno es otra opción porque viene antes, lo ,que significa que es un argumento para la -rpathopción.

No entiendo cómo -rpathpuede tener una -Wl,.discusión!

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

-Wl,-rpath .

Esto debería invocar la opción de enlace -rpath con el argumento del directorio actual.


hombre gcc:

-Wl, opción

Opción de pase como una opción para el vinculador. Si la opción contiene comas, se divide en varias opciones en las comas. Puede usar esta sintaxis para pasar un argumento a la opción. Por ejemplo, -Wl,-Map,output.mappasa -Map output.mapal vinculador. Al usar el enlazador GNU, también puede obtener el mismo efecto con `-Wl, -Map = output.map '.

hombre ld:

-rpath = dir

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

Lloriquear
fuente
2
¿No le falta al título el carácter de punto al final?
Celdor

Respuestas:

277

La -Wl,xxxopción para gcc pasa una lista de tokens separados por comas como una lista de argumentos separados por espacios al enlazador . Entonces

gcc -Wl,aaa,bbb,ccc

finalmente se convierte en una llamada de enlazador

ld aaa bbb ccc

En su caso, desea 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 aaay el segundo -Wl.

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

Kerrek SB
fuente
55
Oh, ahora entiendo, no hay discriminación entre opción o argumento al pasar cosas al enlazador, es solo una cadena. ¡Entonces el segundo -Wl es redundante! Gracias :)
Blub
29
@Blub: ¡No es redundante! Es una forma alternativa, que tampoco dice -Wl,-rpath,. o se dice -Wl,-rpath -Wl,.. Precisamente uno de los dos, no puedes omitir nada.
Kerrek SB
¿Alguien ha tenido éxito al configurar el rpath en OS X, es decir, con clang y ld64?
ben-albrecht
¿Cómo sería la sintaxis si quisiera especificar múltiples rutas? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Hintron
1
@Hintron: Sí, o -Wl,-rpath,dir1,-rpath,dir2, o -Wl,-rpath=dir1,-rpath=dir2.
Kerrek SB
63

También podrías escribir

-Wl,-rpath=.

Para deshacerse de ese molesto espacio. Podría decirse que es más legible que agregar comas adicionales (es exactamente lo que se pasa a ld).

Miguel
fuente
3
De gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options en -Wl,option: " Al usar el enlazador GNU , también puede obtener el mismo efecto con -Wl, -Map = output.map". Para mí, eso parece indicar que si usa un vinculador que no sea el vinculador GNU, es posible que la =sintaxis no sea compatible.
Hintron
39

Otra cosa. Es posible que tenga que especificar la opción -L , así - por ejemplo,

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

o puede terminar con un error como

ld: cannot find -lbaz
Vince
fuente
10

La página del manual lo deja bastante claro. Si desea pasar dos argumentos ( -rpathy .) al enlazador, puede escribir

-Wl,-rpath,.

o alternativamente

-Wl,-rpath -Wl,.

Los argumentos -Wl,-rpath .que sugirió NO tienen sentido para mí. ¿Cómo se supone que gcc sabe que su segundo argumento ( .) se debe pasar al enlazador en lugar de ser interpretado normalmente? La única forma en que podría saberlo es si tuviera conocimiento interno de todos los posibles argumentos de enlace, de modo que supiera que se -rpathrequiere un argumento posterior.

David Grayson
fuente
no es impensable que el gcc analice argumentos y si algo no tiene sentido, se agrupa automáticamente.
Blub