2011-06-12 89 views
15

我有一個二進制「CeeloPartyServer」,需要在運行時在FreeBSD機器上找到libFoundation.so。他們都在同一個目錄中。我使用鏈接器標誌「-rpath = $ ORIGIN」編譯(在另一個平臺上,使用交叉編譯器)CeeloPartyServer。

 
> 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" 

爲什麼在我嘗試運行它時找不到庫?我的確切鏈接行是:-lm -lmysql -rpath = $ ORIGIN。我敢肯定,我不必逃避\ $或類似的東西,因爲我的readelf分析實際上表明庫rpath被設置爲$ ORIGIN。我錯過了什麼?

回答

32

我假設你使用的是gcc和binutils。

如果你

readelf -d CeeloPartyServer | grep ORIGIN 

應該會得到你在上面找到了RPATH行,但你也應該看到國旗某些條目。以下是我建立的圖書館。

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

如果您沒有看到某種FLAGS條目,您可能沒有告訴鏈接器將該對象標記爲需要源處理。使用binutils ld,您可以通過傳遞-z origin標誌來完成此操作。

我猜你正在使用gcc來驅動鏈接,所以在這種情況下,你需要通過編譯器加入-Wl,-z,origin到你的gcc鏈接行。

+0

你所有的假設是正確的。我沒有使用-z原點標誌,從來沒有見過記錄在任何地方。會讓你知道如果解決它。 – Nektarios 2011-06-13 15:53:31

10

根據此標誌在鏈接器看到它之前經過的層數,您可能需要使用$$ORIGIN甚至\$$ORIGIN。當readelf顯示一個類似於$ORIGIN/../lib或類似的RPATH標頭時,您會知道您的設置是正確的。額外的$和反斜槓只是爲了防止$被鏈中其他工具處理。

+4

只是爲了澄清對RPATH不太熟悉的其他人(比如我自己):在編譯過程中設置RPATH時,嘗試'LDFLAGS =「 - Wl,-rpath,'\ $ \ $ ORIGIN'-Wl,-z,origin」 ';其中'echo $ LDFLAGS'將給出:'-Wl,-rpath,'$$ ORIGIN'-Wl,-z,origin'。 (有一些使用'$$'的Makefile魔術。) – kevinarpe 2015-06-12 09:56:53

+0

使用'readelf -d'來查看相關的頭文件或'chrpath'。 – Richard 2016-12-04 07:23:50

0

\ $ \ ORIGIN如果您正在使用chrpath和\ $ \ $ ORIGIN如果您在LDFLAGS

直接提供
相關問題