2011-07-03 14 views
154

Para mayor comodidad, agregué las páginas de manual relevantes a continuación.No entiendo -Wl, -rpath -Wl,

Mi (des) conocimiento en primer lugar: Si necesito para separar opciones con ,, eso significa que el segundo -Wl no es otra opción, ya que viene antes , que significa que es un argumento para la opción -rpath.

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

Lo que tendría sentido en mi mente sería la siguiente:

-Wl,-rpath . 

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


hombre gcc:

-Wl, opción

opción Pass como una opción para la enlazador. 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. Para ejemplo, -Wl,-Map,output.map pasa -Map output.map al vinculador. Cuando usa el enlazador GNU, también puede obtener el mismo efecto con `-Wl, -Map = output.map '.

hombre ld:

-rpath = dir

añadir un directorio a la ruta de búsqueda de biblioteca de tiempo de ejecución . Esto es utilizado al vincular un archivo ejecutable ELF con objetos compartidos. Todos los argumentos -rpath se concatenan y 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 utiliza cuando se encuentran objetos compartidos que son necesarios para los objetos compartidos explícitamente incluidos en el enlace;

Respuesta

182

La opción -Wl,xxx para gcc pasa una lista separada por comas de tokens como una lista separada por espacios de argumentos a la enlazador.Así

gcc -Wl,aaa,bbb,ccc 

finalmente se convierte en una llamada enlazador

ld aaa bbb ccc 

En su caso, que quiere decir "ld -rpath .", de modo que pase esto a gcc como -Wl,-rpath,. Alternativamente, puede especificar los casos de repetición de -Wl:

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

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

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

+4

Oh, ahora entiendo, no hay discriminación entre la opción o el argumento al pasar cosas al enlazador, es solo una cadena. ¡Entonces el segundo -Wl es redundante! Gracias :) – Blub

+21

@Blub: ¡No es redundante! Es una forma alternativa, usted * cualquiera * dice '-Wl, -rpath, .' * o * usted dice' -Wl, -rpath -Wl, .'. Precisamente uno de los dos, no se puede omitir nada. –

7

La página de manual lo deja bastante claro. Si desea pasar dos argumentos (-rpath y .) al enlazador puede escribir

-Wl,-rpath,. 

o alternativamente

-Wl,-rpath -Wl,. 

Los argumentos que -Wl,-rpath . sugeridas no tener sentido para mi mente. ¿Cómo se supone que gcc sabe que su segundo argumento (.) se debe pasar 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, así que sabía que -rpath requería un argumento después.

+0

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

+10

En realidad, es –

29

Una cosa más. 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 
50

También podría 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).

+0

Las páginas man de Debian y Fedora lo especifican de esta manera. – jww