Je ne comprends pas -Wl, -rpath -Wl,

245

Pour plus de commodité, j'ai ajouté les pages de manuel pertinentes ci-dessous.

Ma (mauvaise) compréhension en premier: si j'ai besoin de séparer les options avec ,, cela signifie que la seconde -Wln'est pas une autre option car elle vient avant, ,ce qui signifie qu'elle est un argument en faveur de l' -rpathoption.

Je ne comprends pas comment -rpathpeut avoir un -Wl,.argument!

Ce qui aurait du sens dans mon esprit serait le suivant:

-Wl,-rpath .

Cela devrait invoquer l'option -rpath linker avec l'argument de répertoire courant.


homme gcc:

-Wl, option

Passez l'option comme option à l'éditeur de liens. Si l'option contient des virgules, elle est divisée en plusieurs options au niveau des virgules. Vous pouvez utiliser cette syntaxe pour passer un argument à l'option. Par exemple, -Wl,-Map,output.mappasse -Map output.mapà l'éditeur de liens. Lorsque vous utilisez l'éditeur de liens GNU, vous pouvez également obtenir le même effet avec `-Wl, -Map = output.map '.

homme ld:

-rpath = dir

Ajoutez un répertoire au chemin de recherche de la bibliothèque d'exécution. Ceci est utilisé lors de la liaison d'un exécutable ELF avec des objets partagés. Tous les arguments -rpath sont concaténés et transmis à l'éditeur de liens d'exécution, qui les utilise pour localiser les objets partagés lors de l'exécution. L'option -rpath est également utilisée lors de la localisation d'objets partagés qui sont nécessaires à des objets partagés explicitement inclus dans le lien;

Blub
la source
2
Le titre ne manque-t-il pas à la fin du titre?
Celdor

Réponses:

278

L' -Wl,xxxoption pour gcc transmet une liste d'arguments séparés par des virgules comme une liste d'arguments séparés par des espaces à l' éditeur de liens . Alors

gcc -Wl,aaa,bbb,ccc

devient finalement un appel de l'éditeur de liens

ld aaa bbb ccc

Dans votre cas, vous voulez dire " ld -rpath .", donc vous passez ceci à gcc comme -Wl,-rpath,.Alternativement, vous pouvez spécifier des instances répétées de -Wl:

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

Notez qu'il n'y a pas de virgule entre aaaet la seconde -Wl.

Ou, dans votre cas -Wl,-rpath -Wl,.,.

Kerrek SB
la source
5
Oh, je comprends maintenant, il n'y a pas de discrimination entre l'option ou l'argument lors du passage de choses à l'éditeur de liens, c'est juste une chaîne. Le deuxième -Wl est donc redondant! Merci :)
Blub
29
@Blub: Ce n'est pas redondant! Il est une autre forme, vous soit dites -Wl,-rpath,. ou vous dites -Wl,-rpath -Wl,.. Précisément l'un des deux, vous ne pouvez rien omettre.
Kerrek SB
Quelqu'un at-il réussi à définir le chemin d'accès sur OS X, c'est-à-dire avec clang & ld64?
ben-albrecht
À quoi ressemblerait la syntaxe si vous vouliez spécifier plusieurs chemins d'accès? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Hintron
1
@Hintron: Oui, ou -Wl,-rpath,dir1,-rpath,dir2, ou -Wl,-rpath=dir1,-rpath=dir2.
Kerrek SB
63

Vous pouvez également écrire

-Wl,-rpath=.

Pour se débarrasser de cet espace embêtant. C'est sans doute plus lisible que l'ajout de virgules supplémentaires (c'est exactement ce qui est transmis à ld).

Mike
la source
3
Sur gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options sous -Wl,option: " Lorsque vous utilisez l'éditeur de liens GNU , vous pouvez également obtenir le même effet avec -Wl, -Map = output.map." Pour moi, cela semble indiquer que si vous utilisez un éditeur de liens autre que l'éditeur de liens GNU, la =syntaxe peut ne pas être prise en charge.
Hintron
39

Une autre chose. Vous devrez peut - être spécifier l'option -L ainsi - par exemple

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

ou vous pouvez vous retrouver avec une erreur comme

ld: cannot find -lbaz
vince
la source
10

La page de manuel le montre assez clairement. Si vous voulez passer deux arguments ( -rpathet .) à l'éditeur de liens, vous pouvez écrire

-Wl,-rpath,.

Ou bien

-Wl,-rpath -Wl,.

Les arguments que -Wl,-rpath .vous avez suggérés n'ont pas de sens pour moi. Comment gcc est-il censé savoir que votre deuxième argument ( .) est censé être passé à l'éditeur de liens au lieu d'être interprété normalement? La seule façon dont il serait en mesure de le savoir est d'avoir une connaissance privilégiée de tous les arguments de l'éditeur de liens possibles, de sorte qu'il savait que cela -rpathnécessitait un argument après lui.

David Grayson
la source
il n'est pas impensable que le gcc analyse les arguments et si quelque chose n'a pas de sens, il se regroupe automatiquement.
Blub