Apa cara mencetak jalur pencarian yang di lihat oleh ld dalam urutan pencariannya.
Apa cara mencetak jalur pencarian yang di lihat oleh ld dalam urutan pencariannya.
Jawaban:
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).
ld
jalur pencarian. Sebagai contoh kadang-kadang saya harus mengkompilasi kode sumber dari makefile
atau menghasilkan makefile dari configure
skrip atau dari CMakeLists.txt
atau bahkan yang lebih rumit seperti vala
atau srt
. Sulit bagi saya untuk memodifikasi ld
jalur pencarian dalam kasus seperti itu
Pada Linux, Anda dapat menggunakan ldconfig
, yang mempertahankan konfigurasi ld.so dan cache, untuk mencetak direktori pencarian dengan ld.so
dengan
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v
mencetak pencarian direktori oleh linker (tanpa tab utama) dan perpustakaan bersama yang ditemukan di direktori tersebut (dengan tab terkemuka); yang grep
mendapat direktori. Di mesin saya, baris ini dicetak
/usr/lib64/atlas:
/usr/lib/llvm:
/usr/lib64/llvm:
/usr/lib64/mysql:
/usr/lib64/nvidia:
/usr/lib64/tracker-0.12:
/usr/lib/wine:
/usr/lib64/wine:
/usr/lib64/xulrunner-2:
/lib:
/lib64:
/usr/lib:
/usr/lib64:
/usr/lib64/nvidia/tls: (hwcap: 0x8000000000000000)
/lib/i686: (hwcap: 0x0008000000000000)
/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib/sse2: (hwcap: 0x0000000004000000)
/usr/lib64/tls: (hwcap: 0x8000000000000000)
/usr/lib64/sse2: (hwcap: 0x0000000004000000)
hwcap
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 yang sse2
sesuai dengan kemampuan CPU tambahan. Jalur ini, dengan hwcap
sejalan, dapat berisi pustaka tambahan yang dirancang untuk kemampuan CPU ini.
Satu catatan terakhir: menggunakan -p
alih-alih -v
mencari ld.so
cache sebagai gantinya.
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. Misalnya LD_DEBUG=libs /lib/ld-linux.so --list cat
(Anda dapat menggunakan executable apa pun, saya memilih cat
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 oleh SEARCH_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. Cari SEARCH_DIR("...")
arahan, biasanya di dekat bagian atas output. (Perhatikan bahwa ini tidak selalu sama untuk setiap permintaan ld
- 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
opsi gcc
sehingga menunjukkan kepada Anda bagaimana cara memanggil tautan. Bahkan, biasanya tidak meminta ld
secara langsung, tetapi secara tidak langsung melalui alat yang disebut collect2
(yang hidup di salah satu direktori internal), yang pada gilirannya meminta ld
. Itu akan menunjukkan kepada Anda -L
opsi apa yang sedang digunakan.-Wl,--verbose
ke gcc
opsi untuk membuatnya melewati --verbose
ke linker, untuk melihat skrip linker seperti dijelaskan di atas.-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):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
jika Anda memberi -m32
, itu akan menampilkan direktori perpustakaan yang benar.
Contoh di mesin saya:
untuk g++ -m64
:
/usr/x86_64-linux-gnu/lib64
/usr/i686-linux-gnu/lib64
/usr/local/lib/x86_64-linux-gnu
/usr/local/lib64
/lib/x86_64-linux-gnu
/lib64
/usr/lib/x86_64-linux-gnu
/usr/lib64
/usr/local/lib
/lib
/usr/lib
untuk g++ -m32
:
/usr/i686-linux-gnu/lib32
/usr/local/lib32
/lib32
/usr/lib32
/usr/local/lib/i386-linux-gnu
/usr/local/lib
/lib/i386-linux-gnu
/lib
/usr/lib/i386-linux-gnu
/usr/lib
Pertanyaannya diberi tag Linux, tetapi mungkin ini juga berfungsi di Linux?
gcc -Xlinker -v
Di bawah Mac OS X, ini mencetak:
@(#)PROGRAM:ld PROJECT:ld64-224.1
configured to support archs: armv6 armv7 armv7s arm64 i386 x86_64 armv6m armv7m armv7em
Library search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/usr/lib
Framework search paths:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/
[...]
The -Xlinker
pilihan gcc
di atas hanya lewat -v
untuk ld
. Namun:
ld -v
tidak mencetak jalur pencarian.
-Lpath
. Jadi @ Raphaël Londeix jawabannya lebih baik.
Versi Mac: $ ld -v 2, tidak tahu cara mendapatkan jalur terperinci. keluaran
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
ld
. Orang-orang Binutil menonaktifkannya di skrip build. Telah dinonaktifkan selama bertahun-tahun.
/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?