Programming

我的 linux 二進製文件可以在所有發行版上執行嗎?

  • September 14, 2015

我為 Delphi 找到了一個很好的替代 IDE,稱為 Lazarus。但我對程序員沒有問題。 靜態連結的Linux 二進製文件可以在所有 Linux 發行版上執行嗎

?也就是說,我建構它的 Linux 發行版並不重要,它可以在 Debian / ArchLinux / Ubuntu / OpenSUSE / … 上執行?

根據我的發現,真的只有 32 位和 64 位重要嗎?我想在發布之前確定一下。

這個答案首先是為更一般的問題“我的二進製文件是否可以在所有發行版上執行”而寫的,但它在後半部分解決了靜態連結的二進製文件。


對於比靜態連結的 hello world 更複雜的任何事情,答案可能是否定的。

如果不對分佈 X 進行測試,假設 X 的答案否定的。

如果您想以二進制形式發布您的軟體,請限制自己

  • 一些流行的軟體使用領域的發行版(桌面、伺服器、嵌入式……)
  • 每個版本的最新一到兩個版本

否則,您最終會得到數百個各種大小、版本和年齡的發行版(十年前的發行版仍在使用支持)。

測試那些。只是一些關於可能(並且將會)出錯的指針:

  • 您需要的工具/庫的包在不同發行版甚至同一發行版的版本中都有不同的命名
  • 您需要的庫太新或太舊(版本錯誤)。不要僅僅因為您的程序可以連結,它就與正確的庫連結。
  • 同一個庫(磁碟上的文件)在不同的發行版上的名稱不同,導致無法連結
  • 64 位上的 32 位:可能沒有安裝 32 位環境,或者某些非必要的 32 位庫被移到了 32on64 環境之外的額外包中,因此您對這種情況有額外的依賴。
  • Shell:不要假設您的 Bash 版本。甚至不要假設 Bash。
  • 工具:不要假設某些非 POSIX 命令行工具存在於任何地方。
  • 工具:不要僅僅因為您的發行版的 GNU 版本就認為該工具可以辨識選項。
  • 核心介面:不要/proc僅僅因為它們在您的機器上存在/具有結構就假設文件的存在或結構
  • Java:您確定您的程序無需測試就可以在隨 SLES 一起提供的 IBM JRE 上執行嗎?

獎金:

  • 指令集:在您的機器上編譯的二進製文件不能在舊硬體上執行。

靜態連結(或:將您需要的所有庫與您的軟體捆綁在一起)是一種解決方案嗎?即使它在技術上有效,相關成本也可能很高。所以不幸的是,答案可能也是否定的。

  • 安全性:您將更新庫的責任從您的軟體使用者轉移到您自己身上。
  • 大小和復雜性:只是為了好玩嘗試建構一個靜態連結的 GUI 程序。
  • 互操作性:如果您的軟體是任何類型的“外掛”,則您依賴於呼叫您的軟體。
  • 庫設計:如果您將程序靜態連結到 GNU libc 並使用名稱服務(getpwnam()等),您最終會動態連結到 libc 的 NSS(名稱服務開關)。
  • 庫設計:靜態連結程序的庫使用數據文件或其他資源(如時區或語言環境)。

由於上述所有原因,測試是必不可少的。

  • 熟悉 KVM 或其他虛擬化技術,並擁有您計劃支持的每個發行版的 VM。在每個 VM 上測試您的軟體。
  • 使用這些發行版的最小安裝。
  • 創建具有受限指令集的 VM(例如,沒有 SSE 4)。
  • 僅靜態連結或捆綁:檢查您的二進製文件ldd以查看它們是否真正靜態連結/僅使用您捆綁的庫。
  • 僅靜態連結或捆綁:創建一個空目錄並將您的軟體複製到其中。chroot進入該目錄並執行您的軟體。

引用自:https://unix.stackexchange.com/questions/227910