当前位置: 首页 > article >正文

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

我希望制作一个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.kler.cn/a/590897.html

相关文章:

  • 蓝桥杯备考:特殊01背包问题——》集合subset
  • c++图论(二)之图的存储图解
  • wx142基于django+vue+uniapp的摄影竞赛小程序
  • leetcode-47.全排列II
  • 迷你主机与普通台式电脑区别
  • 【conda activate无效】 conda: error: argument COMMAND: invalid choice: ‘activate‘
  • H-ZERO自定义全局字体 支持项目个性化字体需求
  • 【蓝桥杯速成】| 6.背包问题(01版)
  • C++11 详解版本1.0
  • Python 生成数据(绘制简单的折线图)
  • Redis和MongoDB的区别
  • POJ2301——Beat the Spread!、POJ3624——Charm Bracelet(0-1背包)、POJ2479——Maximum sum
  • 青少年编程与数学 02-011 MySQL数据库应用 04课题、数据库对象
  • 人工智能领域大模型、大模型使用、AI工作流 学习路径
  • 项目实战:基于瑞萨RA6M5构建多节点OTA升级-创建系统最小框架<三>
  • RuoYi-Vue路由,Node
  • 数据库管理-第303期 数据库相关硬件文章汇总(20250319)
  • 详细分析字体选择对话框代码
  • 邀请媒体参会邀约的好处?
  • 解决 开发FFMPEG视频播放器右侧白色线问题