场景介绍
在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/lib64cp /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.gzBuildArch: 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库安全。