centos6.10 编译gcc11.5.0 支持mutilib(32bit,64bit)glibc2.11.3

ops/2025/3/19 7:08:03/

我希望制作一个gcc,使用自带低版本glibc(2.11.3)系统自带glibc是2.12,同时要支持编译32位和64位代码,这样制作的gcc拷贝到其他高版本glibc系统,也可以生成兼容性好的代码

export SRC=/dd/gcc-src
export BUILD=/dd/gcc-build-x86
export TARGET=x86_64-linux-gnu
export PREFIX=/dd/x86_64-linux-gnu-gcc-11.5.0
export PATH=${PREFIX}/bin:$PATH

mkdir -p ${SRC}


linux内核安装
=========================================================
cd ${SRC}/linux-3.10.99/
make ARCH=x86_64 INSTALL_HDR_PATH=${PREFIX}/x86_64-linux-gnu headers_install
make ARCH=i386 INSTALL_HDR_PATH=${PREFIX}/i386-linux-gnu headers_install


binutils安装
=========================================================
mkdir -p ${BUILD}/binutils-2.29/
cd ${BUILD}/binutils-2.29/
${SRC}/binutils-2.29/configure --prefix=${PREFIX} --target=${TARGET} --enable-multilib
make -j8
make install


gcc第一次编译器
=========================================================
mkdir -p ${BUILD}/gcc-11.5.0/
cd ${BUILD}/gcc-11.5.0/
${SRC}/gcc-11.5.0/configure --prefix=${PREFIX} --target=${TARGET} --disable-multilib --disable-bootstrap --enable-languages=c --disable-werror --disable-nls --without-headers --disable-threads --disable-shared --disable-libsanitizer -disable-libssp --disable-libquadmath --disable-libgomp --disable-libvtv --disable-checking

make all-gcc -j8

make install-gcc

make all-target-libgcc -j8

make install-target-libgcc


glibc全量
=========================================================
mkdir -p ${BUILD}/glibc-2.11.3/
cd ${BUILD}/glibc-2.11.3/
${SRC}/glibc-2.11.3/configure --prefix=${PREFIX}/${TARGET} --build=x86_64-linux-gnu --host=${TARGET} --target=${TARGET} --with-headers=${PREFIX}/${TARGET}/include  --disable-multilib  libc_cv_forced_unwind=yes

${SRC}/glibc-2.11.3/configure --prefix=${PREFIX}/${TARGET} --build=x86_64-linux-gnu --with-binutils=${PREFIX}/bin --with-headers=${PREFIX}/${TARGET}/include libc_cv_forced_unwind=yes


mkdir -p ${BUILD}/glibc-2.11.3-i386
cd ${BUILD}/glibc-2.11.3-i386
${SRC}/glibc-2.11.3/configure --prefix=${PREFIX}/i386-linux-gnu --build=x86_64-linux-gnu --host=i686-linux-gnu --with-binutils=${PREFIX}/bin --with-headers=${PREFIX}/i386-linux-gnu/include libc_cv_forced_unwind=yes CC="gcc -m32  -U__i686" CXX="g++ -m32  -U__i686"

${SRC}/glibc-2.11.3/configure --prefix=${PREFIX}/i386-linux-gnu --build=x86_64-linux-gnu --host=i686-linux-gnu --with-headers=${PREFIX}/i386-linux-gnu/include libc_cv_forced_unwind=yes CC="gcc -m32" CXX="g++ -m32"

make -j8 
make install

上面编译很关键的一个参数 -U__i686 可以解决32位编译的一个报错,还是应为gcc11.5版本高了

这里glibc的安装目录,编译gcc的时候识别不到,gcc只能找几个固定位置的glibc

看完编译好的gcc查找路径

这是x86_64的

/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/11.5.0/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../../x86_64-linux-gnu/lib/../lib64/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../x86_64-linux-gnu/11.5.0/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../../lib64/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/lib/x86_64-linux-gnu/11.5.0/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/lib/../lib64/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/usr/lib/x86_64-linux-gnu/11.5.0/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/usr/lib/../lib64/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../../x86_64-linux-gnu/lib/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/lib/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/usr/lib/

这是i386的
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/32/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/11.5.0/32/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../../x86_64-linux-gnu/lib/../lib/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../x86_64-linux-gnu/11.5.0/32/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../../lib/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/lib/x86_64-linux-gnu/11.5.0/32/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/lib/../lib/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/usr/lib/x86_64-linux-gnu/11.5.0/32/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/usr/lib/../lib/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../../x86_64-linux-gnu/lib/x86_64-linux-gnu/11.5.0/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../../x86_64-linux-gnu/lib/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../x86_64-linux-gnu/11.5.0/
/dd/x86_64-linux-gnu-gcc-11.5.0/lib/gcc/x86_64-linux-gnu/11.5.0/../../../
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/lib/x86_64-linux-gnu/11.5.0/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/lib/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/usr/lib/x86_64-linux-gnu/11.5.0/
/dd/x86_64-linux-gnu-gcc-11.5.0/x86_64-linux-gnu/sys-root/usr/lib/

就知道怎么配置glibc的32位和64位的安装目录了,下次编glibc就知道怎么设置--prefix 还有关键的lib目录和include的目录的安装位置了,第一次编放错了只能手动copy到对应位置了,

64位glibc的的头文件和32位glibc的基本一样,区别是include/gnu/stubs-32.h include/gnu/stubs-64.h,其他的头64位生成的有包含对32位的条件编译宏,可以兼容32位。全部使用64位的include就好

64位glibc的库我放在了${PREFIX}/${TARGET}/lib64 

32位glibc的库我放在了${PREFIX}/${TARGET}/lib

还需要修改libc.so libpthread.so这两个脚本里面的路径,绝对路径改成相对路径就好,也方便编译好的gcc copy到其他系统时有效


gcc第二次全量1 glibc路径正确直接这个步骤
=========================================================
cd ${BUILD}/gcc-11.5.0/
${SRC}/gcc-11.5.0/configure --prefix=${PREFIX} --target=${TARGET} --disable-multilib --disable-bootstrap --enable-languages=c,c++ --disable-werror --disable-nls 

make -j8
make install


gcc第二次全量2 glibc路径不正确还可以用  --with-sysroot --with-native-system-header-dir调整
=========================================================
cd ${BUILD}/gcc-11.5.0/
${SRC}/gcc-11.5.0/configure --prefix=${PREFIX} --target=${TARGET} --host=${TARGET} --disable-bootstrap --enable-languages=c,c++ --disable-werror --disable-nls --enable-multilib  --with-multilib-list=m64,m32 CFLAGS="-I${PREFIX}/i386-linux-gnu/include -I${PREFIX}/x86_64-linux-gnu/include" CXXFLAGS="-I${PREFIX}/i386-linux-gnu/include -I${PREFIX}/x86_64-linux-gnu/include" LDFLAGS="-L${PREFIX}/i386-linux-gnu/lib -L${PREFIX}/x86_64-linux-gnu/lib"

--with-native-system-header-dir=/include --with-sysroot=${PREFIX}/${TARGET}

#--with-sysroot=/ --with-build-sysroot=${PREFIX}/${TARGET}
#上面(--with-sysroot的值) + (--with-native-system-header-dir的值)是include查找目录编译能成功,但是libc.so脚本内容路径要改
--with-native-system-header-dir必须绝对路径默认/usr/include,--with-sysroot内部有效

make -j8
make install
 


http://www.ppmy.cn/ops/166971.html

相关文章

【算法】动态规划

⭐️个人主页:小羊 ⭐️所属专栏:Linux 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 动态规划总结1、常见动态规划Fibonacci数列杨辉三角最小花费爬楼梯孩子们的游戏不同路径不同路径II珠宝的最高价值下降路径最小和…

leetcode 3110. 字符串的分数 简单

给你一个字符串 s 。一个字符串的 分数 定义为相邻字符 ASCII 码差值绝对值的和。 请你返回 s 的 分数 。 示例 1: 输入:s "hello" 输出:13 解释: s 中字符的 ASCII 码分别为:h 104 ,e …

SY6280AAC usb电流限流电子开关

电流设置图 电路原理图 参考链接 SY6280AAC -PDF数据手册-参考资料-立创商城https://item.szlcsc.com/datasheet/SY6280AAC/56162.html?spmsc.it.xds.a&lcsc_vidRgVaBABUQgdeAQZTR1FbUwBfRlEIVFNTEVlXXgFSTlAxVlNSRVNXVFBRRVZWVDsOAxUeFF5JWAIASQYPGQZABAsLWA%3D%3D 我做…

C++学习之云盘项目nginx

1.复习 2.知识点概述 1. 一些基本概念 1.1 Nginx 初步认识 1.2 正向 / 反向代理 1.3 域名和 IP 2. Nginx 安装和配置 2.1 安装 2.2 配置 3. Nginx 的使用 3.1 部署静态网页 3.2 反向代理和负载均衡 课外知识导读 1. URL 和 URI 2. DNS 解析过程 1. 一些基…

批量测试IP和域名联通性2

在前面批量测试IP和域名联通性-CSDN博客的基础上,由于IP和域名多样性,比如带端口号的192.168.1.17:17,实际上应该ping 192.168.1.17。如果封禁http://www.abc.com/a.exe,实际可ping www.abc.com。所以又完善了代码。 echo off se…

【npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree】

npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree 当我们拿到一个前端项目的时候,想要把它运行起来,首先是要给它安装依赖,即cd到…

Python 集合全面解析

一、集合核心特性 1. ​无序性与唯一性 ​无序性:集合中的元素没有固定顺序,无法通过索引访问。​唯一性:自动过滤重复元素,确保每个元素唯一。 unique_set {1, 2, 2, "苹果", "苹果"} # 输出&#xff1…

数据结构——双向链表dlist

前言:大家好😍,本文主要介绍了数据结构——双向链表dlist 一 双向链表定义 1. 双向链表的节点结构 二 双向链表操作 2.1 定义 2.2 初始化 2.3 插入 2.3.1 头插 2.3.2 尾插 2.3.3 按位置插 2.4 删除 2.4.1 头删 2.4.2 尾删 2.4.3 按…