從原始碼安裝軟體的意義#

在 Linux 中安裝軟體有兩大途徑:從原始碼編譯或使用套件管理器。理解原始碼安裝的流程,即使你日常不常用到,也能幫助你理解軟體是如何從人類可讀的程式碼變成機器可執行的程式。

開放原始碼的編譯流程#

從原始碼到可執行檔#

  1. 原始碼(Source Code):人類撰寫的程式碼(C、C++ 等)
  2. 編譯(Compile):編譯器(如 GCC)將原始碼轉換為目的檔(Object File)
  3. 連結(Link):將多個目的檔與函式庫(Library)連結,產生最終的可執行檔(Executable)

編譯出的可執行檔是平台相關的——在 x86_64 上編譯的程式無法在 ARM 上執行,反之亦然。這就是為什麼同一個開源軟體要針對不同的 CPU 架構分別提供二進位套件。

函式庫(Library)#

函式庫是被多個程式共用的功能模組:

  • 靜態函式庫(Static Library, .a:編譯時直接嵌入可執行檔。檔案較大,但執行時不需要外部依賴
  • 動態函式庫(Shared Library, .so:執行時才載入。檔案較小,多個程式可共享同一份函式庫

現代 Linux 幾乎都使用動態函式庫。ldd 指令可以查看一個程式依賴哪些動態函式庫。當程式執行時出現「Library not found」錯誤,就是缺少它需要的 .so 檔案。

make 與 Makefile#

當專案包含多個原始碼檔案時,手動一個一個編譯既麻煩又容易出錯。make 工具透過讀取 Makefile 來自動化編譯流程:

  • Makefile 定義了編譯目標相依性、以及編譯指令
  • make 會檢查檔案的修改時間,只重新編譯有變動的部分,大幅節省時間

make 不只用於 C/C++ 專案。許多不同語言的專案都使用 Makefile 來定義建置、測試、部署等任務。它是一個通用的任務自動化工具。

Tarball 安裝的標準三步驟#

從原始碼安裝軟體的標準流程:

1. configure#

./configure 腳本負責:

  • 偵測系統環境(CPU 架構、編譯器版本、函式庫位置)
  • 讓使用者選擇功能開關(啟用/停用特定功能)
  • 產生適合目前系統的 Makefile

2. make#

根據 Makefile 的定義進行編譯。

3. make install#

將編譯好的程式、函式庫、設定檔複製到系統的指定位置。

從原始碼安裝的軟體不受套件管理器追蹤,解安裝和更新都需要手動處理。建議將自行編譯的軟體安裝在 /usr/local//opt/,與系統套件分開,避免衝突。

函式庫管理#

ldconfig 與快取#

動態函式庫的搜尋路徑記錄在 /etc/ld.so.confldconfig 會根據這個檔案建立快取(/etc/ld.so.cache),加速函式庫的查找。

新增了函式庫後,需要執行 ldconfig 更新快取,否則程式可能找不到新增的函式庫。

ldd:檢查依賴#

ldd 列出一個可執行檔依賴的所有動態函式庫,並顯示它們的實際路徑。當程式無法執行且錯誤訊息指向函式庫問題時,ldd 是首要的診斷工具。

軟體驗證#

從網路下載的原始碼可能被竄改。驗證檔案完整性的方式:

  • MD5 / SHA1 / SHA256 指紋:計算檔案的雜湊值,與官方提供的值比對
  • GPG 簽章:用開發者的公鑰驗證數位簽章

直接從非官方來源下載原始碼並編譯安裝,是供應鏈攻擊的風險點。務必驗證檔案的完整性與來源。