我希望制作一个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