2011-06-12 12 views
15

Bir FreeBSD makinesinde, çalışma zamanında libFoundation.so dosyasını bulması gereken bir ikili "CeeloPartyServer" var. İkisi de aynı dizinde. Linker flag "-rpath = $ ORIGIN" kullanarak CeeloPartyServer (bir çapraz derleyici kullanarak başka bir platformda) derleyin.

 
> readelf -d CeeloPartyServer |grep -i rpath 
0x0000000f (RPATH)      Library rpath: [$ORIGIN] 
> ls 
CeeloPartyServer Contents  Foundation.framework libFoundation.so 
> ./CeeloPartyServer 
/libexec/ld-elf.so.1: Shared object "libFoundation.so" not found, required by "CeeloPartyServer" 

Çalıştırmaya çalıştığımda neden kitaplığı bulamıyor? Tam bağlayıcı hattım: -lm -lmysql -rpath = $ ORIGIN. Ben gerçekten eminim ki, read-read analizim aslında kütüphane rpath'in $ ORIGIN olarak ayarlandığını gösterdiğinden, bende böyle bir şeyden kaçmak zorunda kalmam. Neyi kaçırıyorum?

cevap

32

Gcc ve binutils kullandığınızı varsayalım.

Eğer

readelf -d CeeloPartyServer | grep ORIGIN 

yaparsanız Sen yukarıda bulunan rpath hattını geri almalısınız, ama aynı zamanda bayrakları hakkında bazı girdileri görmelisiniz. Aşağıdaki, oluşturduğum bir kitaplıktan.

0x000000000000000f (RPATH)    Library rpath: [$ORIGIN/../lib] 
0x000000000000001e (FLAGS)    ORIGIN 
0x000000006ffffffb (FLAGS_1)   Flags: ORIGIN 

Eğer BAYRAKLARI girişlerin çeşit görmüyorsanız, muhtemelen kökenli işlemeyi gerektiren olarak nesneyi işaretlemek için bağlayıcı söylemedim. Binutils ld ile -z origin bayrağını geçirerek bunu yaparsınız.

Bağlantıyı sürmek için gcc kullandığınızı tahmin ediyorum, bu durumda gcc bağlantı satırına -Wl,-z,origin ekleyerek derleyiciden bayrağı geçirmeniz gerekecek.

+0

Tüm varsayımlar doğru sağlıyorsanız eğer chrpath ve \ $ \ $ ORIGIN kullanıyorsanız. -z orijin işaretini kullanmıyorum, hiç bir yerde belgelenmemiş. Bunu çözüp çözmeyeceğini söylerim. – Nektarios

10

Bu bayrağın, bağlayıcı görmeden önce kaç kat geçtiğine bağlı olarak, $$ORIGIN veya \$$ORIGIN'u kullanmanız gerekebilir. readelf, $ORIGIN/../lib veya benzeri gibi görünen bir RPATH başlığını gösterdiğinde doğru anladığınızı bileceksiniz. Ekstra $ ve ters eğik çizgi, $ in zincirdeki diğer araçlar tarafından işlenmesini önlemek içindir. $ \ ORIGIN \

+4

RPATH'a daha az aşina olan diğerleri için (örneğin kendimi) açıklığa kavuşturmak için: Derleme sırasında RPATH'yi ayarlarken, LDFLAGS = "- Wl, -rpath, '\ $ \ $ ORIGIN' -Wl, -z, origin" yi deneyin. '; “echo $ LDFLAGS” ifadesi şu şekildedir: -Wl, -rpath, '$$ ORIGIN' -Wl, -z, origin'. ("$$' ile bazı Makefile büyüsü var.) – kevinarpe

+0

İlgili üstbilgiyi veya "chrpath" değerini görmek için 'readelf -d' kullanın. – Richard

0

Eğer LDFLAGS

doğrudan