首页 > 系统管理 > LFS > LFS7.6 003 GCC-4.9.1 – Pass 1
2015
03-01

LFS7.6 003 GCC-4.9.1 – Pass 1

GCC-4.9.1 – Pass 1

工具简介:

大名鼎鼎的GCC工具,就不用我多说了。

一、解压GCC安装包及所需的三个库。

代码:

tar xvf gcc-4.9.1.tar.bz2
cd gcc-4.9.1
tar -xf ../mpfr-3.1.2.tar.xz
mv -v mpfr-3.1.2 mpfr
tar -xf ../gmp-6.0.0a.tar.xz
mv -v gmp-6.0.0 gmp
tar -xf ../mpc-1.0.2.tar.gz
mv -v mpc-1.0.2 mpc

详解:

mpfr,gmp和mpc三个库被放在gcc-4.9.1这个目录中。

二、设置GCC

为了防止发生错误,应做出如下的修改。

代码:

for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h)
do
cp -uv $file{,.orig}
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
-e 's@/usr@/tools@g' $file.orig > $file
echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/"
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file
touch $file.orig
done

检查Gilbc版本:

代码:

ldd  --version

详解:

我曾多次编译错误,原因就是没有注意Glibc的版本。

查看版本号与书中的版本号不同,书中是glibc2.20,而这个版本的Ubuntu是glibc2.19

这时我们不要盲目的使用LFS7.6书中的参数:

我们下载LFS7.5book,里面的参数是glibc2.19的。

所以:

sed -i '/k prot/agcc_cv_libc_provides_ssp=yes' gcc/configure

三、编译安装以及扫尾。

创建编译目录:

mkdir -v ../gcc-build
cd ../gcc-build

configure参数设置如下:

../gcc-4.9.1/configure \
--target=$LFS_TGT \
--prefix=/tools \
--with-sysroot=$LFS \
--with-newlib \
--without-headers \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-decimal-float \
--disable-threads \
--disable-libatomic \
--disable-libgomp \
--disable-libitm \
--disable-libquadmath \
--disable-libsanitizer \
--disable-libssp \
--disable-libvtv \
--disable-libcilkrts \
--disable-libstdc++-v3 \
--enable-languages=c,c++

详解:

--with-newlib

由于C库不可以用,所以这可以确保在构建libgcc时inhibit_libc常数被定义。这保证了编译需要libc支持的任何代码。

--without-headers

当创建一个完整的交叉编译程序,GCC要求标准头文件与目标系统兼容。为了我们的目的,这些头文件是不需要的。这个开关可以防止GCC寻找他们。

--with-local-prefix=/tools

当前的prefix是系统中的当前的位置,GCC将搜索本地安装的include文件。默认的是/usr/local。设置这个到/tools,有助于使/usr/local从这个GCC的搜索路径去除。

--with-native-system-header-dir=/tools/include

默认情况下GCC会在/usr/include目录中搜索系统头文件。结合sysroot开关,这样通常情况下会转到$LFS/usr/include。尽管如此,这些头文件在接下来的两个部分会被安装到$LFS/tools/include。这个开关确保gcc会正确地找到他们。在第二次编译GCC,同样的开关将确保没有头文件从主机系统中被找到。

--disable-shared

该参数强制 GCC 链接其内部的静态库。 我们这样做是为了避免和宿主系统产生问题。

--disable-decimal-float, --disable-threads, --disable-libatomic, --disablelibgomp,--disable-libitm,--disable-libquadmath, --disable-libsanitizer, --disable-libssp, --disable-libvtv, --disable-libcilkrts, --disable-libstdc++-v3

这些参数分别禁用了十进制浮点运算、线程、libatomic, libgomp, libitm,libquadmath, libsanitizer, libssp, libvtv, libcilkrts和C++标准库的支持。 这些功能在建立交叉编译程序时会造成编译失败,而且,在交叉编译临时libc的任务中也不是必需的。

--disable-multilib

在 x86_64 架构上, LFS 系统还不支持 multilib 的配置。 这个参数对x86架构是无害的。

--enable-languages=c,c++

这个参数确保只建立C和C++编译器。我们现在只需要这两种编译器。

开始编译:

代码:

make -j4    #-j4在这里可以加快编译速度,4是线程数。

安装:

代码:

make install

扫尾工作:

代码:

cd ..
rm -rf gcc-build
rm -rf gcc-4.9.1

THE END:GCC-4.9.1安装完成,下一步:LFS7.6 004 Linux-3.16.2 API Headers + Glibc-2.20




最后编辑:
作者:PurStar
PurStar
这个作者貌似有点懒,什么都没有留下。
捐 赠您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击

留下一个回复