Ld tarafından arama sırasını arama sırasına göre yazdırmanın yolu nedir .
Ld tarafından arama sırasını arama sırasına göre yazdırmanın yolu nedir .
Yanıtlar:
Bunu aşağıdaki komutu yürüterek yapabilirsiniz:
ld --verbose | grep SEARCH_DIR | tr -s ' ;' \\012
gcc , bağlayıcıya aşağıdaki komutla listeleyebileceğiniz birkaç ekstra -L yolu geçirir:
gcc -print-search-dirs | sed '/^lib/b 1;d;:1;s,/[^/.][^/]*/\.\./,/,;t 1;s,:[^=]*=,:;,;s,;,; ,g' | tr \; \\012
İlgili oldukları için yollar yolu ile araştırılmıştır aynı değildir zamanı dinamik bağlayıcı (örneğin, bir program çalıştırılır zaman) tarafından incelenmiştir için kullanımı ld.so dosyasına ve ldconfig'i öneren yanıtları doğru değildir İd (yani her bir program bağlı).
ld
Arama yolunu geçersiz kılmanın küresel bir yolunu kastetmiştim . Örneğin bazen bir kaynak kodunu derlemek zorunda makefile
veya üreten makefile configure
komut dosyası veya gelen CMakeLists.txt
ya gibi daha karmaşık olanları vala
ya srt
. Bu ld
gibi durumlarda arama yolunu değiştirmek benim için zor
Linux'ta, ldconfig
ld.so yapılandırmasını ve önbelleğini koruyan dizinleri kullanarak arama ld.so
yapmak için kullanabilirsiniz.
ldconfig -v 2>/dev/null | grep -v ^$'\t'
ldconfig -v
linker tarafından (dizin sekmesi olmadan) dizin aramasını ve bu dizinlerde bulunan (önde gelen sekmeyle) paylaşılan kütüphaneleri yazdırır; grep
dizinleri alır. Makinemde bu çizgi yazdırılıyor
/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
Satır olmadan ilk yollar yerleşiktir veya /etc/ld.so.conf kaynağından okunur. Bağlayıcı daha sonra temel kütüphane arama yolu altında sse2
ek CPU yeteneklerine karşılık gelen adlarla ek dizinleri arayabilir . Çizgideki bu yollar, hwcap
bu CPU yetenekleri için uyarlanmış ek kütüphaneler içerebilir.
Son bir not: yukarıdaki -p
yerine kullanmak önbelleği -v
arar ld.so
.
export LD_LIBRARY_PATH=/some/other/dir
bu komutun çıktısını etkilememesi nasıl mümkün olur ?! % 100 çalışmıyor mu?
LD_LIBRARY_PATH
hata ayıklama etkinleştirerek. Örneğin LD_DEBUG=libs /lib/ld-linux.so --list cat
(herhangi bir yürütülebilir dosyayı kullanabilirsiniz, aklıma cat
gelen ilk şey olarak seçtim ). " search path
" İçin selamlamaya değer olabilir . /etc/ld.so.cache
Tüm gerekli kütüphanelere uyan bir sisteminiz varsa, yerleşik sistem arama yolunu göremeyeceğinizi unutmayın, çünkü o kadar ileri gitmeyecektir.
gcc
arama yolu bunlarla aynı?
Tam etkili arama yolunu yazdırmak için herhangi bir seçenek olduğundan emin değilim.
Ancak: arama yolu -L
, komut satırındaki seçeneklerle belirtilen dizinleri ve ardından SEARCH_DIR("...")
bağlayıcı komut dosyalarındaki yönergelerle arama yoluna eklenen dizinleri içerir . Böylece, aşağıdaki gibi yapabileceğiniz her ikisini de görebiliyorsanız çalışabilirsiniz:
ld
Doğrudan çağırıyorsanız :
-L
Seçenekler olduklarını belirtti modlin vardır.--verbose
seçeneği ekleyin . SEARCH_DIR("...")
Genellikle çıktının üst kısmına yakın olan yönergeleri arayın . (Bunların her çağrılması için aynı olmaları gerekmediğini unutmayın ld
- bağlayıcı, bir dizi farklı yerleşik varsayılan bağlayıcı komut dosyasına sahiptir ve bunlar arasında diğer çeşitli bağlayıcı seçeneklerine göre seçim yapar.)Üzerinden bağlantı yapıyorsanız gcc
:
-v
Seçeneği gcc
, bağlayıcıyı nasıl çağırdığını gösterecek şekilde iletebilirsiniz . Aslında, normal olarak ld
doğrudan değil , dolaylı olarak collect2
(iç dizinlerinden birinde yaşayan) adlı bir araç aracılığıyla çağırır ve bu da çağırır ld
. Bu, hangi -L
seçeneklerin kullanıldığını gösterecektir .-Wl,--verbose
sağlamak için gcc
seçeneklere ekleyebilirsiniz --verbose
.-T script
anlaşılıyor tamamen ld varsayılan betiğin yerini aldı ve sadece işaret ettiğim yere baktı.
Linux'ta gcc ve clang için bulduğum en uyumlu komut (armando.sano sayesinde):
$ gcc -m64 -Xlinker --verbose 2>/dev/null | grep SEARCH | sed 's/SEARCH_DIR("=\?\([^"]\+\)"); */\1\n/g' | grep -vE '^$'
verirseniz -m32
, doğru kütüphane dizinlerini verir.
Makinemdeki örnekler:
için 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
için 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
Soru Linux olarak etiketlenmiş, ancak belki de Linux altında bu işe yarıyor mu?
gcc -Xlinker -v
Mac OS X'te bu yazdırılır:
@(#)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/
[...]
-Xlinker
Seçeneği gcc
hemen üstünde geçer -v
etmek ld
. Ancak:
ld -v
arama yolunu yazdırmaz.
-Lpath
. Yani @ Raphaël Londeix'in cevabı daha iyi.
Mac sürümü: $ ld -v 2, ayrıntılı yolların nasıl alınacağını bilmiyorum. çıktı
Library search paths:
/usr/lib
/usr/local/lib
Framework search paths:
/Library/Frameworks/
/System/Library/Frameworks/
ld -v 2
ld
. Binutil millet, yapı komut dosyalarında devre dışı bıraktı. Yıllardır devre dışı bırakıldı.
/usr/local/..
eksik kitaplık hatasına neden olan el ile yüklenen kitaplıkları bulur ve bağlantı başarısız olur./usr/local
Bu arama yolunu hariç tutmak için her zaman yeniden adlandırmam gerekiyor./usr/local
Yolu hariç tutmanın veya geçersiz kılmanın basit bir yolu var mı ?