8

我正在尋找一種方法來製作與特定版本的系統庫鏈接的現有專有ELF二進制文件。對於可移植性,我的意思是使每個系統具有相同的處理器架構和兼容的系統內核的可執行文件,而不必擁有這些庫的源代碼(如果沒有源代碼就沒有辦法,那也可以) 。在Linux上製作可移植的專有ELF二進制文件

到目前爲止,我想到了兩種可能性,但我不知道他們是否在所有可能的,如果是,可供選擇:

  1. 搜索所有鏈接庫和他們的依賴,並將其包含在二進制文件的子目錄並將Library-Path更改爲該目錄。
  2. 將這些庫靜態地重新鏈接到二進制文件中以形成一個大的可執行文件(如果程序不根據校驗和驗證自身)。

許可證不是問題,因爲我不想分發創建的便攜式程序,它僅供個人使用。

感謝您的回答。

+0

http://stackoverflow.com/questions/2157636 | http://stackoverflow.com/questions/16250831 | http://stackoverflow.com/questions/15386027 – 2015-06-04 16:00:14

回答

6

搜索所有鏈接庫及其依賴關係,並將它們包含在二進制文件的子目錄中,並將庫路徑更改爲該目錄。

這將適用於大多數共享庫,但不會爲libc.so.6工作(這是一個最容易產生問題,如果你的目標系統沒有足夠新的版本)。

原因:glibc由200多個單獨的共享庫組成,它們之間有未版本化的二進制接口,並且它們之間沒有穩定的ABI。因此,全部部分glibc必須來自相同的構建。其中一個部分是libc.so.6。另一種是ld-linux.so。後者的絕對路徑是將硬編碼的轉換爲每個動態可執行文件。最終結果是:如果您提供自己的libc.so.6副本,並且該副本與系統上的/lib/ld-linux*.so.2不匹配,那麼您會看到很難解釋或調試的非常奇怪的崩潰。

將這些庫靜態地重新鏈接到二進制文件中,以一個大的可執行文件。

這不能不是AIX以外的任何UNIX系統上工作:他們都認爲a.outfoo.so最終環節的產品,這是不能被任何進一步的聯繫。

存在statifier,它確實創建了一個動態的(巨大)靜態可執行文件。我沒有使用它的經驗。

+0

感謝您的詳細解答。今天晚些時候(格林威治標準時間+1),我會試一試,然後看看它能否以某種方式幫助我。 – FSMaxB 2013-03-18 08:03:02

+0

Statifier似乎不能很好地工作,其他軟件可以幫助我實現我的目標(貂皮)是專有的。但至少有一種方法可以實現我所想的。 – FSMaxB 2013-03-18 08:44:11

+0

我試過貂皮,它工作正常(使用試用版) – FSMaxB 2013-03-22 07:24:28

相關問題