如何编译与依赖项动态链接的Git?
如何编译动态链接版Git(与发行版一致)
问题背景
我使用以下脚本编译Git:
local gitVersion="2.37.0" url="https://github.com/git/git/archive/refs/tags/v$gitVersion.tar.gz" tempDir=$(mktemp -d) && mkdir -p "$tempDir" && ( cd "$tempDir" && curl -L "$url" -o git.tar.gz && tar -xf git.tar.gz && cd "$tempDir/git-"* && make configure && ./configure --prefix="/usr/local" \ --with-curl \ --with-expat \ --with-openssl \ --without-python \ --without-tcltk \ --sysconfdir=/etc \ --with-gitconfig=/etc/gitconfig && make -j all )
编译后/usr/local/libexec/git-core目录下的可执行文件体积约21MB,通过ldd检测确认是静态链接导致:
ldd /usr/local/libexec/git-core/git-checkout linux-vdso.so.1 (0x00007ffe24991000) libz.so.1 => /lib64/libz.so.1 (0x00007fb635ef0000) librt.so.1 => /lib64/librt.so.1 (0x00007fb635ce8000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb635ac8000) libc.so.6 => /lib64/libc.so.6 (0x00007fb635703000) /lib64/ld-linux-x86-64.so.2 (0x00007fb636108000)
而发行版预装的Git采用动态链接,依赖更多系统库:
ldd /usr/libexec/git-core/git-checkout linux-vdso.so.1 (0x00007fff5755c000) libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007ff1a7744000) libz.so.1 => /lib64/libz.so.1 (0x00007ff1a752c000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007ff1a730c000) librt.so.1 => /lib64/librt.so.1 (0x00007ff1a7104000) libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007ff1a6c1b000) libc.so.6 => /lib64/libc.so.6 (0x00007ff1a6856000) /lib64/ld-linux-x86-64.so.2 (0x00007ff1a7f56000) libdl.so.2 => /lib64/libdl.so.2 (0x00007ff1a6652000)
请问如何实现与发行版一致的动态链接效果?Git的configure是否有对应配置选项?
解决方案
1. 核心configure选项调整
Git的默认编译配置会优先静态链接部分依赖,通过以下选项强制启用动态链接:
--enable-shared:开启动态链接库的构建--disable-static:禁用静态链接库的构建--with-libpcre2:显式指定使用系统自带的PCRE2库(对应发行版的依赖项)
修改后的configure命令如下:
./configure --prefix="/usr/local" \ --with-curl \ --with-expat \ --with-openssl \ --with-libpcre2 \ --without-python \ --without-tcltk \ --sysconfdir=/etc \ --with-gitconfig=/etc/gitconfig \ --enable-shared \ --disable-static
2. 完整编译流程
- 清理旧编译文件:如果之前安装过静态版Git,先卸载并清理缓存
sudo make uninstall make distclean - 安装依赖开发包:确保系统已安装所有依赖的开发文件(不同发行版包名略有差异)
- RHEL/CentOS系列:
sudo yum install libcurl-devel expat-devel openssl-devel pcre2-devel zlib-devel - Debian/Ubuntu系列:
sudo apt install libcurl4-openssl-dev libexpat1-dev libssl-dev libpcre2-dev zlib1g-dev
- RHEL/CentOS系列:
- 重新编译安装:
make configure && ./configure [上述修改后的完整选项] && make -j$(nproc) && sudo make install
3. 验证效果
编译完成后,再次执行ldd命令检查:
ldd /usr/local/libexec/git-core/git-checkout
此时会看到与发行版类似的依赖库列表,可执行文件体积会降至几MB,符合动态链接的预期。
内容的提问来源于stack exchange,提问作者Gabriel
相关产品推荐
相关产品推荐

