2010-03-09 25 views
2

我坐在一個我沒有真正控制的環境中(它不只是我,所以基本上,我不能改變環境或贏得' t爲其他人工作),我唯一可以影響的是二進制文件是如何構建的。忽略LD_LIBRARY_PATH並堅持鏈接時通過-rpath給出的庫

我的問題是,環境指定了一個LD_LIBRARY_PATH,其中包含一個與正在使用的編譯器不兼容的libstdC++。我試着靜態編譯它,但對g ++來說似乎不可能(版本4.2.3,似乎在後來的版本中已經完成了這方面的工作,儘管它不可​​用,-static-libstdC++或類似的東西)。

現在我已經到達使用rpath將絕對路徑名稱烘焙到可執行文件中(可以工作,它應該運行的所有機器都是相同的)。不幸的是,似乎LD_LIBRARY_PATH優先於rpath(重置LD_LIBRARY_PATH確認它能夠找到該庫,但如上所述,將爲每個人設置LD_LIBRARY_PATH,並且我無法更改它)。

有沒有什麼辦法可以使rpath優先於LD_LIBRARY_PATH,還是有任何其他可能的解決方案來解決我的問題嗎?請注意,我在運行時討論動態鏈接,我可以在編譯和鏈接時控制命令行。

謝謝。

回答

1

libstdc++.a鏈接是絕對有可能的,雖然棘手。說明here

我有點懷疑你聲稱LD_LIBRARY_PATH優先於「中烤」的DT_RPATH但 - 至少在Linux和(我相信)的Solaris,LD_LIBRARY_PATH只是看了之後DT_RPATH查找失敗。

+0

我看過這篇文章,'僞造'沒有'.so'文件的目錄可能有效。我只能改變編譯器和命令行(儘管我想我可以將編譯器改爲腳本),但我也許可以創建自己的lib目錄。我會給它一個鏡頭。至於第二部分,這是一個Solaris環境,我做的測試是:'ldd binary'從LD_LIBRARY_PATH生成庫,'LD_LIBRARY_PATH = ldd binary'生成一個(不重要的)烘焙文件。我不知道這些東西是如何實現的,我只能告訴你我看到了什麼。 – falstro 2010-03-10 08:58:33

+0

聲明在Solaris下'LD_LIBRARY_PATH'優先於'DT_RPATH'是* [絕對正確](http://docs.oracle.com/cd/E19082-01/819-0690/chapter6-63352/index.html) *只要進程不符合[安全進程]的定義(http://docs.oracle.com/cd/E19683-01/816-1386/6m7qcobkt/index.html)。 – vladr 2013-05-02 18:46:53

3

也許你可以使用一個shell包裝器來修改這個程序的環境?

#!/bin/sh 

LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}" 
export LD_LIBRARY_PATH 
exec /path/to/binary [email protected] 

這應該在執行前重載LD_LIBRARY_PATH,然後用exec通過二進制文件替換包裝器。

這會有幫助嗎?