2011-05-13 83 views
7

是否有某種方式使用ld.so.preload並覆蓋32位和64位二進制文​​件?在多拱安裝使用/etc/ld.so.preload中

如果我列出ld.so.preload故障處理程序的32位和64位版本,然後加載器總是抱怨其中之一不預裝了我運行任何命令。不完全是地球震動,因爲錯誤更多的是警告,但我可以確實沒有打印輸出。

而不是指定一個絕對路徑我試着簡單地指定「segv_handler.so」,希望加載程序能夠選擇適當的路徑中的lib(32位版本位於/ lib中,而64位版本位於/ lib64中)。

不太可能明顯。

有沒有辦法設置ld.so.preload是建築知道​​?或者如果沒有,有什麼方法可以關閉錯誤信息?

回答

1

可悲的是,我認爲答案可能是「不要那樣做。」

glibcelf/rtld.c

通常沒有ld.so.preload文件,它應該只用於緊急情況和測試。所以公開呼籲等通常應該失敗。在不存在的文件上使用access()比使用open()更快。所以我們先做。如果它成功了,我們幾乎可以做兩倍的工作,但這並不重要,因爲它不適合用於生產。

2

沒有理由嘗試像這樣使用ld.so.preload。默認情況下,ld足夠聰明,知道如果你正在運行一個64位應用程序來查找64位庫,並且與32位相同。

典型的例子,如果你有

/lib64/libawesome.so /lib/libawesome.so

,並嘗試

的gcc -o -lawesome快樂一刻funtime.c

它會選擇gcc想要構建的默認值,ld將跳過該構建的不正確位大小的庫。

的gcc -m64 -lawesome -o快樂一刻funtime.c將挑選64位一個

的gcc -m32 -lawesome -o快樂一刻funetime.c將挑選32位之一。

這假定/etc/ld.so.conf中列出了/ lib和/ lib64下默認..

1

可以在路徑名稱中使用特殊擴展鍵提供32位和64位庫。 例如,您可以使用/lib/$PLATFORM/mylib.so創造/lib/i386/mylib.so/lib/x86_64/mylib.so。 Linked將爲您的可執行文件選擇正確的文件。

4

這工作:在/ path

  1. 放庫/ lib中的32位一個,並把64位的一個在/ path/lib64的 ,他們應該有相同的名稱
  2. 把下面的行/etc/ld.so.preload中: /path/$LIB/libname.so

$ LIB將自動獲得值 「lib」(對32位)或 「lib64目錄」(64位)。