場景介紹
在Linux系統上,作為動態庫文件的so文件的應用是非常廣泛的,在有些場景下so庫是需要打包為安裝包來進行使用的,例如開發了一個so庫進行分發時,就需要將so庫打包成安裝包釋放到系統的指定路徑下進行集成分發,這裏介紹一下將so庫打包為Linux系統的安裝包的流程。
so庫打包流程
so庫打包為rpm
so庫打包為rpm安裝包是通過rpm-build和rpmdevtools工具實現的,以loader_linux_x64.so為例,具體流程如下:
1.安裝rpm-build和rpmdevtools
sudo yum install rpm-build rpmdevtools -y
或
sudo dnf install rpm-build rpmdevtools -y
2.創建RPM構建目錄結構
1.使用命令自動創建目錄結構
rpmdev-setuptree
或
2.手動創建目錄
mkdir -p ~/rpmbuild/{BUILD,BUILDROOT,RPMS,SOURCES,SPECS,SRPMS}
目錄結構介紹
- BUILD: 源碼包解壓和編譯的臨時目錄。
- BUILDROOT: 虛擬安裝根目錄,打包過程中文件會安裝到這裏。
- RPMS: 存放生成的二進制RPM包。
- SOURCES: 存放源代碼(如.tar.gz包)和補丁文件。
- SPECS: 存放spec文件(打包的"圖紙")。
- SRPMS: 存放源碼RPM包。
3.將loader_linux_x64.so文件放在指定目錄,並打包成 .tar.gz 格式放入SOURCES目錄
mkdir -p /tmp/mylib-1.0/usr/lib64
cp /path/to/your/loader_linux_x64.so /tmp/mylib-1.0/usr/lib64/
tar -czvf mylib-1.0.tar.gz mylib-1.0 .
mv mylib-1.0.tar.gz ~/rpmbuild/SOURCES/
4.在~/rpmbuild/SPECS/目錄下創建一個名為mylib.spec的文件,用來構建rpmbuildRPM包,具體內容如下:
Name: mylib
Version: 1.0
Release: 1%{?dist}
Summary: My custom library (loader_linux_x64.so)
License: GPLv3+
Source0: %{name}-%{version}.tar.gz
BuildArch: x86_64
%description
This package provides the loader_linux_x64.so library file.
%prep
%setup -q
%install
rm -rf %{buildroot}
install -m 755 -d %{buildroot}/usr/lib64
install -m 755 usr/lib64/loader_linux_x64.so %{buildroot}/usr/lib64/
%files
/usr/lib64/loader_linux_x64.so
主要內容提醒:
Name、Version、Release: 定義了軟件包的名稱、版本和發行號。Source0: 指定源碼包名稱,%{name}和%{version}是宏,會自動展開。%install: 安裝階段,將文件複製到虛擬安裝根目錄 (%{buildroot}) 下。注意文件最終會安裝到系統的/usr/lib64/,但構建時需安裝到%{buildroot}/usr/lib64/。%files: 必須明確列出包要包含的文件路徑(相對於根目錄的路徑)。這裏指定安裝/usr/lib64/loader_linux_x64.so。
5.使用rpmbuild命令構建RPM包
cd ~/rpmbuild/SPECS
# 構建二進制RPM包,-bb表示只生成二進制包
rpmbuild -bb mylib.spec
構建成功會在~/rpmbuild/RPMS/x86_64/(取決於系統架構)目錄下找到生成的RPM文件,例如mylib-1.0-1.el7.x86_64.rpm
6.安裝rpm包後loader_linux_x64.so庫會在系統的/usr/lib64/loader_linux_x64.so路徑下
so庫打包為deb
so庫打包為deb安裝包的流程更為簡單一些,直接通過dpkg-deb工具即可,以loader_linux_x64.so為例,具體流程如下:
1.創建包目錄結構
mkdir -p ~/loader_pkg
2.將loader_linux_x64.so文件放在標準的系統路徑下,在loader_pkg目錄下創建目錄並拷貝文件。
mkdir -p usr/lib
cp /path/to/your/loader_linux_x64.so usr/lib/
3.在loader_pkg目錄下,創建一個名為DEBIAN的文件夾(全部大寫),這個文件夾用來存放包的控制信息。
4.在DEBIAN目錄下創建控制腳本(DEBIAN/control文件),腳本內容可以參考以下內容:
Package: loader-linux-x64
Version: 1.0.0
Section: libs
Priority: optional
Architecture: amd64
Depends: libc6 (>= 2.34)
5.在loader_pkg目錄的上一級目錄中,運行以下命令來構建.deb 文件:
dpkg-deb -b loader_pkg loader-linux-x64_1.0.0_amd64.deb
構建成功後會在當前目錄找到loader-linux-x64_1.0.0_amd64.deb文件。
6.安裝deb包後loader_linux_x64.so庫會在系統的/usr/lib/loader_linux_x64.so路徑下
安全防護
以上介紹了so庫構建為安裝包的打包流程,該過程方便了so庫的分發、版本管理、依賴管理等一系列流程,但是安裝包安裝釋放後的so文件在正式發佈時還是有很大的風險的,打包是方便了so庫的使用流程,其本身的代碼並沒有進行保護,發佈後還是源碼。
針對so庫的安全防護,這裏推薦一款成熟的保護工具:Virbox Protector,該工具為Linux ELF格式的so庫文件提供了全面的保護方案。在文件層面,具備壓縮、內存保護和校驗功能;在函數層面,則提供了代碼混淆和代碼虛擬化等高強度安全措施,全方位的保護so庫安全。