如何编译32位及64位glibc以解决静态链接依赖报错问题
编译前依赖准备
提前安装编译所需的基础工具,不同发行版对应安装命令如下:
- Debian/Ubuntu 系:
apt install gcc g++ make bison flex gettext texinfo gcc-multilib g++-multilib - RHEL/CentOS/Fedora 系:
dnf install gcc gcc-c++ make bison flex gettext texinfo glibc-devel.i686 libgcc.i686
注意:glibc 不支持在源码根目录直接编译,必须创建独立的构建目录,否则会直接编译失败。
64位版本 glibc 编译步骤
- 进入你克隆的 glibc 源码目录,先切换到稳定版本分支(不推荐直接用master分支,稳定性差),比如切换到2.35版本:
git checkout glibc-2.35,版本号可以根据你实际需要的glibc版本调整 - 新建独立的64位构建目录并进入:
mkdir build64 && cd build64 - 执行配置命令,替换
/your/custom/glibc64_path为你自己要存放编译产物的绝对路径:../configure --prefix=/your/custom/glibc64_path --enable-static --disable-werror - 执行编译,线程数根据你的CPU核心数调整:
make -j$(nproc) - 执行安装命令,编译好的静态库、头文件都会输出到你指定的prefix路径下:
make install
32位版本 glibc 编译步骤
- 回到glibc源码根目录,新建独立的32位构建目录并进入:
mkdir build32 && cd build32 - 执行32位架构的配置命令,替换
/your/custom/glibc32_path为你自己要存放32位编译产物的绝对路径:CC="gcc -m32" CXX="g++ -m32" ../configure --prefix=/your/custom/glibc32_path --enable-static --disable-werror --host=i686-linux-gnu --build=x86_64-linux-gnu
如果你的编译主机本身就是32位系统,可以去掉--build=x86_64-linux-gnu参数 - 执行编译:
make -j$(nproc) - 执行安装:
make install
后续使用注意事项
- 静态链接你的mylib.a时,除了加
-I指定对应架构的glibc头文件路径、-L指定对应glibc库路径外,还要给gcc加上-static参数,且保证glibc的链接顺序在mylib.a之前,避免出现符号冲突 - 若出现未找到libc相关符号的报错,可额外添加
-lc参数强制链接静态glibc库 - 全静态链接glibc会导致生成的二进制体积大幅增加,且涉及NSS、DNS解析、用户权限查询等功能时可能出现运行异常,如果没有特殊要求,也可以考虑改用musl libc做静态编译,体积更小、兼容性更好
内容的提问来源于stack exchange,提问作者Stryker2k2
相关产品推荐
相关产品推荐

