2010-07-08 61 views

回答

3

與自定義路徑替換路徑到現有庫

如果這是你自己的圖書館,那麼你可能將它鏈接這樣的:

$ cc -o prog1 -l/full/path/to/libABC.so prog1.o 

,而不是正確的:

$ cc -o prog1 -L/full/path/to/ -lABC prog1.o 

第一種方法告訴Linux鏈接器應用程序需要預先明智地說,圖書館,只有這個圖書館,不應該是可能的。第二種方法告訴應用程序需要安裝在系統某處的庫,無論是默認的庫路徑還是$ LD_LIBRARY_PATH指向的路徑(在運行時查找)。 -L僅在鏈接時使用。

否則,首先檢查是否可以使用符號鏈接來替換庫,而不是修補ELF。這是常用的技巧:之後很難修改可執行文件,但是很容易改變符號鏈接點的位置。

1

您可能需要檢查LD_LIBRARY_PATH環境變量。

1

如果通過readelf看看Linux中的顯.dynsym部分,你只看到:

1: 0000000000000000 163 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (2) 

其中只包含庫的符號名稱。但是,如果包括動態加載的信息,您可以:

libc.so.6 => /lib/libc.so.6 (0x00002ba11da4a000) 
    /lib64/ld-linux-x86-64.so.2 (0x00002ba11d82a000) 

所以如前所述,絕對最容易的事情(假設你這樣做了調試,而不是永遠)也只是建立一個新會話,將您的自定義路徑導出到現有的LD_LIBRARY_PATH之前,然後從那裏開始。