Ld (bağlayıcı) arama yolu nasıl yazdırılır


153

Ld tarafından arama sırasını arama sırasına göre yazdırmanın yolu nedir .

Yanıtlar:


96

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ı).


2
Yere vurdun. Bağlama işlemi sırasında, bağlayıcı işlemi sırasında /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/localBu arama yolunu hariç tutmak için her zaman yeniden adlandırmam gerekiyor. /usr/localYolu hariç tutmanın veya geçersiz kılmanın basit bir yolu var mı ?
kenn

1
El ile (emin değilim) sistem kitaplığı yollarını geçersiz kılacağını düşünüyorum GCC için -L seçeneği ile kitaplık yollarını belirtmeye çalışabilirsiniz. ... $ Library_Path = / somedir / gcc: Ayrıca derlemeden önce Library_Path env değişkeni ayarlamak için deneyebilirsiniz
faken

1
Komut satırı derlemesinde bağlantı olduğunu biliyorum. ldArama yolunu geçersiz kılmanın küresel bir yolunu kastetmiştim . Örneğin bazen bir kaynak kodunu derlemek zorunda makefileveya üreten makefile configurekomut dosyası veya gelen CMakeLists.txtya gibi daha karmaşık olanları valaya srt. Bu ldgibi durumlarda arama yolunu değiştirmek benim için zor
kenn

CMake'i kullanırken, yapılandırma aşamasında kullanılan kitaplıkları kesin olarak seçebilirsiniz (bu girdilerin bazıları yalnızca gelişmiş modda gösterilir). Autotools'tan komut dosyaları yapılandırmaya gelince, şu yanıta bakın: stackoverflow.com/questions/7561509/… . Bu, sorunuza doğrudan cevap vermez, ancak istediğinizi yapmanıza yardımcı olabilir.
faken

82

Linux'ta, ldconfigld.so yapılandırmasını ve önbelleğini koruyan dizinleri kullanarak arama ld.soyapmak için kullanabilirsiniz.

ldconfig -v 2>/dev/null | grep -v ^$'\t'

ldconfig -vlinker tarafından (dizin sekmesi olmadan) dizin aramasını ve bu dizinlerde bulunan (önde gelen sekmeyle) paylaşılan kütüphaneleri yazdırır; grepdizinleri 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)

hwcapSatı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 sse2ek CPU yeteneklerine karşılık gelen adlarla ek dizinleri arayabilir . Çizgideki bu yollar, hwcapbu CPU yetenekleri için uyarlanmış ek kütüphaneler içerebilir.

Son bir not: yukarıdaki -pyerine kullanmak önbelleği -varar ld.so.


51
Yükleyiciyi değil (ld.so) bağlayıcıyı (ld) soruyor!
fons

3
Ayarlarsam, export LD_LIBRARY_PATH=/some/other/dirbu komutun çıktısını etkilememesi nasıl mümkün olur ?! % 100 çalışmıyor mu?
TMS

3
@fons Funnything bu yanıtı aramak için buraya geldim. :) bağlantı zamanı veya çalışma zamanı yolu? Sanırım soru bu. LIBRAY_PATH (bağlantı süresi) - LD_LIBRARY_PATH.
Daniel Santos

2
Bazı platformlarda (örneğin Linaro araç zinciri ile kol) buldum, ldconfig aslında çalışma süresi bağlayıcısıyla aynı dizinleri aramıyor. Sen edebilirsiniz çıkışına kendi arama yolunu almak ve gelen yolları dahil LD_LIBRARY_PATHhata 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 catgelen ilk şey olarak seçtim ). " search path" İçin selamlamaya değer olabilir . /etc/ld.so.cacheTüm gerekli kütüphanelere uyan bir sisteminiz varsa, yerleşik sistem arama yolunu göremeyeceğinizi unutmayın, çünkü o kadar ileri gitmeyecektir.
John O'M.

gccarama yolu bunlarla aynı?
nn0p

68

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:

ldDoğrudan çağırıyorsanız :

  • -LSeçenekler olduklarını belirtti modlin vardır.
  • Bağlayıcı komut dosyasını görmek için --verboseseç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:

  • -vSeçeneği gcc, bağlayıcıyı nasıl çağırdığını gösterecek şekilde iletebilirsiniz . Aslında, normal olarak lddoğ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 -Lseçeneklerin kullanıldığını gösterecektir .
  • Yukarıda açıklandığı gibi bağlayıcı komut dosyasını görmek için bağlayıcıya geçmesini -Wl,--verbosesağlamak için gccseçeneklere ekleyebilirsiniz --verbose.

5
Bağlayıcı için --verbose seçeneği işe yaradı. Çok yararlı!
Ari

Bağlayıcının nereye baktığını ve çıkışta SEARCH_DIR bulamadığını anlamaya çalışıyordum. Senaryomu kullandığım -T scriptanlaşılıyor tamamen ld varsayılan betiğin yerini aldı ve sadece işaret ettiğim yere baktı.
thomasa88

30

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

Teşekkür ederim! ufacık geliştirme - bir grep veya iki kurtulmak: sed -n 's / SEARCH_DIR ("= \? ([^"] \ +) "); * / \ 1 \ n / gp'
Bruce K

2
Bu neden bu kadar belirsiz bir yöntem gerektiriyor?
bmacnaughton

Bu bir cazibe gibi çalıştı! Bu listeye, linker arama yoluna nasıl dizin ekleyebiliriz?
pari

6

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/
[...]

-XlinkerSeçeneği gcchemen üstünde geçer -vetmek ld. Ancak:

ld -v

arama yolunu yazdırmaz.


Linux'ta da dizinleri de yazdırır -Lpath. Yani @ Raphaël Londeix'in cevabı daha iyi.
pevik

2

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/

3
"2 açılamıyor: böyle bir dosya veya dizin yok" alıyorum. Koşuld -v 2
Jack

2
Soru Linux olarak etiketlenmiş, OS X değil. OS X'in GNU kullandığına inanmıyorum ld. Binutil millet, yapı komut dosyalarında devre dışı bıraktı. Yıllardır devre dışı bırakıldı.
jww
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.