Apa cara mencetak jalur pencarian yang di lihat oleh ld dalam urutan pencariannya.
153
Anda dapat melakukan ini dengan menjalankan perintah berikut:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc melewati beberapa jalur -L tambahan ke tautan, yang dapat Anda daftarkan dengan perintah berikut:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
Jawaban yang menyarankan untuk menggunakan ld.so.conf dan ldconfig tidak benar karena mereka merujuk ke jalur yang dicari oleh runtime dynamic linker (yaitu setiap kali suatu program dijalankan), yang tidak sama dengan jalur yang dicari oleh ld (yaitu kapan saja sebuah program terhubung).
/usr/local/..
yang menyebabkan kesalahan pustaka yang hilang, dan penautan gagal. Saya harus mengganti nama/usr/local
setiap kali untuk mengecualikan jalur pencarian itu. Apakah ada cara sederhana untuk mengecualikan atau mengganti/usr/local
jalur?ld
jalur pencarian. Sebagai contoh kadang-kadang saya harus mengkompilasi kode sumber darimakefile
atau menghasilkan makefile dariconfigure
skrip atau dariCMakeLists.txt
atau bahkan yang lebih rumit sepertivala
atausrt
. Sulit bagi saya untuk memodifikasild
jalur pencarian dalam kasus seperti ituPada Linux, Anda dapat menggunakan
ldconfig
, yang mempertahankan konfigurasi ld.so dan cache, untuk mencetak direktori pencarian denganld.so
denganldconfig -v
mencetak pencarian direktori oleh linker (tanpa tab utama) dan perpustakaan bersama yang ditemukan di direktori tersebut (dengan tab terkemuka); yanggrep
mendapat direktori. Di mesin saya, baris ini dicetakhwcap
Path pertama, tanpa di baris, adalah built-in atau dibaca dari /etc/ld.so.conf. Linker kemudian dapat mencari direktori tambahan di bawah jalur pencarian perpustakaan dasar, dengan nama-nama seperti yangsse2
sesuai dengan kemampuan CPU tambahan. Jalur ini, denganhwcap
sejalan, dapat berisi pustaka tambahan yang dirancang untuk kemampuan CPU ini.Satu catatan terakhir: menggunakan
-p
alih-alih-v
mencarild.so
cache sebagai gantinya.sumber
export LD_LIBRARY_PATH=/some/other/dir
, itu tidak akan mempengaruhi output dari perintah ini ?! Sepertinya tidak berfungsi 100%?LD_LIBRARY_PATH
dengan mengaktifkan debugging. MisalnyaLD_DEBUG=libs /lib/ld-linux.so --list cat
(Anda dapat menggunakan executable apa pun, saya memilihcat
sebagai hal pertama yang dapat saya pikirkan). Mungkin layak untuk dipahami "search path
". Perhatikan bahwa jika Anda memiliki/etc/ld.so.cache
yang cocok dengan semua lib yang diperlukan, Anda tidak akan bisa melihat jalur pencarian sistem bawaan, karena itu tidak akan sejauh itu.gcc
jalur pencarian sama dengan ini?Saya tidak yakin bahwa ada opsi untuk hanya mencetak jalur pencarian efektif penuh.
Tetapi: jalur pencarian terdiri dari direktori yang ditentukan oleh
-L
opsi pada baris perintah, diikuti oleh direktori yang ditambahkan ke jalur pencarian olehSEARCH_DIR("...")
arahan dalam skrip linker. Jadi Anda bisa menyelesaikannya jika Anda dapat melihat keduanya, yang dapat Anda lakukan sebagai berikut:Jika Anda memohon
ld
langsung:-L
opsi apa pun yang Anda katakan mereka.--verbose
opsi. CariSEARCH_DIR("...")
arahan, biasanya di dekat bagian atas output. (Perhatikan bahwa ini tidak selalu sama untuk setiap permintaanld
- penghubung memiliki sejumlah skrip tautan bawaan bawaan yang berbeda, dan memilih di antara mereka berdasarkan pada berbagai opsi penghubung lainnya.)Jika Anda menautkan melalui
gcc
:-v
opsigcc
sehingga menunjukkan kepada Anda bagaimana cara memanggil tautan. Bahkan, biasanya tidak memintald
secara langsung, tetapi secara tidak langsung melalui alat yang disebutcollect2
(yang hidup di salah satu direktori internal), yang pada gilirannya memintald
. Itu akan menunjukkan kepada Anda-L
opsi apa yang sedang digunakan.-Wl,--verbose
kegcc
opsi untuk membuatnya melewati--verbose
ke linker, untuk melihat skrip linker seperti dijelaskan di atas.sumber
-T script
skrip saya sepenuhnya menggantikan skrip default ld dan hanya melihat di mana saya menunjuk.Perintah paling kompatibel yang saya temukan untuk gcc dan dentang di Linux (terima kasih kepada armando.sano):
jika Anda memberi
-m32
, itu akan menampilkan direktori perpustakaan yang benar.Contoh di mesin saya:
untuk
g++ -m64
:untuk
g++ -m32
:sumber
Pertanyaannya diberi tag Linux, tetapi mungkin ini juga berfungsi di Linux?
Di bawah Mac OS X, ini mencetak:
The
-Xlinker
pilihangcc
di atas hanya lewat-v
untukld
. Namun:tidak mencetak jalur pencarian.
sumber
-Lpath
. Jadi @ Raphaël Londeix jawabannya lebih baik.Versi Mac: $ ld -v 2, tidak tahu cara mendapatkan jalur terperinci. keluaran
sumber
ld -v 2
ld
. Orang-orang Binutil menonaktifkannya di skrip build. Telah dinonaktifkan selama bertahun-tahun.