首页 > 系统管理 > LFS > LFS7.6 006 Binutils-2.24 – Pass 2 + GCC-4.9.1 – Pass 2
2015
03-03

LFS7.6 006 Binutils-2.24 – Pass 2 + GCC-4.9.1 – Pass 2

LFS7.6 006 Binutils-2.24 – Pass 2 + GCC-4.9.1 – Pass 2

一、Binutils-2.24 – Pass 2

1.解压并切换相应的目录:

tar xvf binutils-2.24.tar.bz2 
cd binutils-2.24

2.创建编译目录并切换到相应的目录:

mkdir -v ../binutils-build
cd ../binutils-build

3.编译参数设置

CC=$LFS_TGT-gcc \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../binutils-2.24/configure \
--prefix=/tools \
--disable-nls \
--disable-werror \
--with-lib-path=/tools/lib \
--with-sysroot

参数详解:

CC="$LFS_TGT-gcc -B/tools/lib/" AR=$LFS_TGT-ar RANLIB=$LFS_TGT-ranlib
因为这是真实的编译 Binutils, 所以, 设置这些变量是为了确保编译系统使用的是交叉编译器和相关工具, 而不是宿主系统的工具。
--with-lib-path=/tools/lib
这个选项告诉 configure 脚本在 Binutils 编译过程中将传递给连接器的库搜索路径设为 /tools/lib,以防止连接器搜索宿主系统的库目录。

4.开始编译这个源码包:

make -j4

5.开始安装:

make install

6.现在,为下面的"再调整"阶段准备连接器:

make -C ld clean
make -C ld LIB_PATH=/usr/lib:/lib
cp -v ld/ld-new /tools/bin

参数详解:

-C ld clean
该参数告诉 make 程序,删除 ld 子目录下所有已编译的文件。
-C ld LIB_PATH=/usr/lib:/lib
该参数重新编译 ld 子目录下的所有文件。具体说就是,命令行上 LIB_PATH 的Makefile 变量可以覆盖临时工具的默认值, 并将它指定到正确的最终目录。 这个变量的值指定了链接器默认的库搜索路径。这是为下一章使用做准备。

7.扫尾工作:

cd ..
rm -rf binutils-2.24
rm -rf binutils-build

二、GCC-4.9.1 – Pass 2

1.解压并切换到相应的目录:

tar xvf gcc-4.9.1.tar.bz2
cd gcc-4.9.1

2.这次的GCC编译需要完整的头文件,所以进行如下设置:

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h

3.改变当前的默认的GCC符号链接,来使用安装在/tools下的那一个。

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

4.解压GCC编译时需要的3个库文件,并将它们放在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

5.建立编译目录并切换到相应的目录:

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

6.编译参数的设置

CC=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../gcc-4.9.1/configure \
--prefix=/tools \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--enable-languages=c,c++ \
--disable-libstdcxx-pch \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp

参数详解:

--enable-languages=c,c++
本参数确保编译 C 和 C++ 语言的编译器。
--disable-libstdcxx-pch
不为 libstdc++ 编译预编译头(PCH),它占用了很大空间,并且我们用不到它。
--disable-bootstrap
对于本地编译GCC,默认是进行"bootstrap" 编译。这不仅仅是编译GCC,而且要编译好几次。它用第一次编译的程序再次编译它自己,然后再第三次编译。 第二次和第三次迭代比较来确保重新生成完美的自己。 这也暗示编译正确。 然而, LFS系统创建方法应该提供一个可信赖的 无需每次引导编译器。

7.开始编译这个源码包:

make -j4

8.安装这个编译好的软件包

make install

9.作为画龙点睛,创建一个符号链接。很多程序和脚本运行 cc 而不是 gcc, 这可以保持程序的通用性, 并可以用在各种UNIX系统上。UNIx系统并不都安装GNU C编译器。 运行 cc 让系统管理员自由决定要安装哪一个C编译器:

ln -sv gcc /tools/bin/cc

10.进行扫尾工作:

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

三、现在,需要停下来确认新工具链的基本功能(编译和连接)是否按预期工作, 运行下面的命令做一个简单的合理性检查:

测试代码如下:

echo 'main(){}' > dummy.c
cc dummy.c
readelf -l a.out | grep ': /tools'

没有错误,并且显示:

[Requesting program interpreter: /tools/lib64/ld-linux-x86-64.so.2]

说明成功,删除测试文件:

rm -v dummy.c a.out

下一步:LFS7.6 007 Tcl-8.6.2+Expect-5.45+DejaGNU-1.5.1




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

留下一个回复