Saya tidak mengerti -Wl, -rpath -Wl,

244

Untuk kenyamanan saya menambahkan halaman manual yang relevan di bawah ini.

Pemahaman (salah) saya yang pertama: Jika saya perlu memisahkan opsi ,, itu berarti yang kedua -Wlbukan opsi lain karena ia datang sebelumnya ,yang berarti ini adalah argumen untuk -rpathopsi.

Saya tidak mengerti bagaimana -rpathbisa -Wl,.berdebat!

Apa yang masuk akal di benak saya adalah ini:

-Wl,-rpath .

Ini harus memanggil opsi -rpath linker dengan argumen direktori saat ini.


man gcc:

-Wl, opsi

Lulus opsi sebagai opsi ke tautan. Jika opsi berisi koma, itu dibagi menjadi beberapa opsi di koma. Anda dapat menggunakan sintaks ini untuk meneruskan argumen ke opsi. Misalnya, -Wl,-Map,output.mapberalih -Map output.mapke tautan. Saat menggunakan penghubung GNU, Anda juga bisa mendapatkan efek yang sama dengan `-Wl, -Map = output.map '.

man ld:

-rpath = dir

Tambahkan direktori ke jalur pencarian perpustakaan runtime. Ini digunakan saat menghubungkan ELF yang dapat dieksekusi dengan objek bersama. Semua -rpath argumen disatukan dan diteruskan ke linker runtime, yang menggunakannya untuk menemukan objek bersama saat runtime. Opsi -rpath juga digunakan ketika menemukan objek bersama yang dibutuhkan oleh objek bersama secara eksplisit termasuk dalam tautan;

Blub
sumber
2
Bukankah judulnya hilang karakter titik pada akhirnya?
Celdor

Jawaban:

277

The -Wl,xxxpilihan untuk gcc melewati daftar dipisahkan koma token sebagai daftar dipisahkan dengan spasi dari argumen ke linker . Begitu

gcc -Wl,aaa,bbb,ccc

akhirnya menjadi panggilan tautan

ld aaa bbb ccc

Dalam kasus Anda, Anda ingin mengatakan " ld -rpath .", sehingga Anda meneruskannya ke gcc sebagai -Wl,-rpath,.Alternatifnya, Anda dapat menentukan contoh berulang -Wl:

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

Perhatikan bahwa tidak ada koma antara aaadan yang kedua -Wl.

Atau, dalam kasus Anda -Wl,-rpath -Wl,.,.

Kerrek SB
sumber
5
Oh saya mengerti sekarang, tidak ada diskriminasi antara opsi atau argumen saat memberikan barang kepada linker, itu hanya string. Jadi -Wl kedua adalah redundan! Terima kasih :)
Blub
29
@ Blub: Itu tidak berlebihan! Ini adalah bentuk alternatif, Anda baik katakan -Wl,-rpath,. atau Anda katakan -Wl,-rpath -Wl,.. Salah satu dari keduanya, Anda tidak bisa menghilangkan apa pun.
Kerrek SB
Adakah yang berhasil mengatur rpath di OS X, yaitu dengan clang & ld64?
ben-albrecht
Seperti apa sintaksisnya jika Anda ingin menentukan beberapa rpath? -Wl,-rpath -Wl,. -Wl,-rpath -Wl,/my/lib?
Hintron
1
@Intron: Ya, atau -Wl,-rpath,dir1,-rpath,dir2, atau -Wl,-rpath=dir1,-rpath=dir2.
Kerrek SB
63

Anda juga bisa menulis

-Wl,-rpath=.

Untuk menyingkirkan ruang sial itu. Ini bisa dibilang lebih mudah dibaca daripada menambahkan koma tambahan (itulah yang diteruskan ke ld).

Mike
sumber
3
Dari gcc.gnu.org/onlinedocs/gcc/Link-Options.html#Link-Options di bawah -Wl,option: " Saat menggunakan penghubung GNU , Anda juga bisa mendapatkan efek yang sama dengan -Wl, -Map = output.map." Bagi saya, itu tampaknya menunjukkan bahwa jika Anda menggunakan tautan selain penghubung GNU, =sintaksis mungkin tidak didukung.
Hintron
39

Satu hal lagi. Anda mungkin perlu menentukan opsi -L juga - misalnya

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

atau Anda mungkin berakhir dengan kesalahan seperti

ld: cannot find -lbaz
vince
sumber
10

Halaman manual membuatnya cukup jelas. Jika Anda ingin memberikan dua argumen ( -rpathdan .) ke tautan Anda dapat menulis

-Wl,-rpath,.

atau sebagai alternatif

-Wl,-rpath -Wl,.

Argumen yang -Wl,-rpath .Anda sarankan TIDAK masuk akal bagi saya. Bagaimana gcc seharusnya tahu bahwa argumen kedua Anda ( .) seharusnya diteruskan ke tautan daripada ditafsirkan secara normal? Satu-satunya cara untuk mengetahui hal itu adalah jika ia memiliki pengetahuan orang dalam tentang semua argumen penghubung yang mungkin sehingga ia tahu bahwa -rpathdiperlukan argumen setelahnya.

David Grayson
sumber
itu tidak terpikirkan bahwa gcc menganalisis argumen dan jika sesuatu tidak masuk akal, ia secara otomatis dikelompokkan.
Blub