Eu não entendo -Wl, -rpath -Wl,

244

Por conveniência, adicionei as páginas de manual relevantes abaixo.

Meu (mal) entendimento primeiro: se eu precisar separar opções ,, isso significa que a segunda -Wlnão é outra opção, porque ela vem antes, o ,que significa que é um argumento para a -rpathopção.

Eu não entendo como -rpathpode ter uma -Wl,.discussão!

O que faria sentido em minha mente seria o seguinte:

-Wl,-rpath .

Isso deve chamar a opção -rpath linker com o argumento do diretório atual.


man gcc:

-Wl, opção

Passe a opção como uma opção para o vinculador. Se a opção contiver vírgulas, ela será dividida em várias opções. Você pode usar esta sintaxe para passar um argumento para a opção Por exemplo, -Wl,-Map,output.mappassa -Map output.mappara o vinculador. Ao usar o vinculador GNU, você também pode obter o mesmo efeito com `-Wl, -Map = output.map '.

man ld:

-rpath = dir

Inclua um diretório no caminho de pesquisa da biblioteca de tempo de execução. Isso é usado ao vincular um executável ELF a objetos compartilhados. Todos os argumentos -rpath são concatenados e transmitidos ao vinculador de tempo de execução, que os utiliza para localizar objetos compartilhados no tempo de execução. A opção -rpath também é usada ao localizar objetos compartilhados, necessários aos objetos compartilhados explicitamente incluídos no link;

Blub
fonte
2
Não está faltando o caractere de ponto no título?
Celdor

Respostas:

277

A -Wl,xxxopção para gcc passa uma lista de tokens separados por vírgula como uma lista de argumentos separados por espaço para o vinculador . assim

gcc -Wl,aaa,bbb,ccc

eventualmente se torna uma chamada de vinculador

ld aaa bbb ccc

No seu caso, você quer dizer " ld -rpath .", para passar isso para o gcc como -Wl,-rpath,.alternativa. Você pode especificar instâncias repetidas de -Wl:

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

Observe que não há vírgula entre aaae o segundo -Wl.

Ou, no seu caso -Wl,-rpath -Wl,.,.

Kerrek SB
fonte
5
Ah, eu entendo agora, não há discriminação entre opção ou argumento ao passar coisas para o vinculador, é apenas uma string. Portanto, o segundo -Wl é redundante! Obrigado :)
Blub
29
@Blub: Não é redundante! É uma forma alternativa, você quer dizer -Wl,-rpath,. ou você diz -Wl,-rpath -Wl,.. Precisamente um dos dois, você não pode omitir nada.
Kerrek SB 03/07
Alguém já teve sucesso em definir o rpath no OS X, ou seja, com o clang & ld64?
ben-Albrecht
Como seria a sintaxe se você quisesse especificar vários rpaths? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Hintron 31/01/19
1
@Hintron: Sim, ou -Wl,-rpath,dir1,-rpath,dir2, ou -Wl,-rpath=dir1,-rpath=dir2.
Kerrek SB 31/01/19
63

Você também pode escrever

-Wl,-rpath=.

Para se livrar desse espaço traquina. É sem dúvida mais legível do que adicionar vírgulas extras (é exatamente o que é passado para o ld).

Mike
fonte
3
Em gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options em -Wl,option: " Ao usar o vinculador GNU , você também pode obter o mesmo efeito com -Wl, -Map = output.map." Para mim, isso parece indicar que, se você usar um vinculador que não seja o GNU, a =sintaxe poderá não ser suportada.
Hintron 31/01/19
39

Mais uma coisa Pode ser necessário especificar a opção -L bem - por exemplo,

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

ou você pode acabar com um erro como

ld: cannot find -lbaz
vince
fonte
10

A página de manual deixa bem claro. Se você deseja passar dois argumentos ( -rpathe .) para o vinculador, pode escrever

-Wl,-rpath,.

ou alternativamente

-Wl,-rpath -Wl,.

Os argumentos que -Wl,-rpath .você sugeriu NÃO fazem sentido para mim. Como o gcc deve saber que seu segundo argumento ( .) deve ser passado para o vinculador em vez de ser interpretado normalmente? A única maneira de saber isso é se tivesse conhecimento interno de todos os argumentos possíveis do vinculador, para que soubesse que era -rpathnecessário um argumento depois dele.

David Grayson
fonte
não é impensável que o gcc analise argumentos e, se algo não faz sentido, ele agrupa automaticamente.
Blub