12.构建LFS系统──安装系统基础软件(四)
时间:2006-11-17 来源:anima
十二、构建LFS系统──安装系统基础软件(四)
10.再次调整工具链
现在,最终的 C 库已经安装好了,我们需要再次调整工具链,让本章随后编译的那些工具都连接到这个库上。基本上,就是把构建临时编译环境中"调整工具链"那里做的调整给取消掉。在构建临时编译环境中,工具链使用的库是从宿主系统的 /{,usr/}lib 转向新安装的 /tools/lib 目录。同样的,现在工具链使用的库将从临时的 /tools/lib 转向 LFS 系统最终的 /{,usr/}lib 目录。
首先,备份 /tools 下的链接,用我们在第 5 章中编译的链接器来替换,再创建一个链接到在 /tools/$(gcc -dumpmachine)/bin 中的复本。
root:/sources/glibc-build# mv -v /tools/bin/{ld,ld-old}
`/tools/bin/ld' -> `/tools/bin/ld-old'
root:/sources/glibc-build# mv -v /tools/$(gcc -dumpmachine)/bin/{ld,ld-old}
`/tools/i686-pc-linux-gnu/bin/ld' -> `/tools/i686-pc-linux-gnu/bin/ld-old'
root:/sources/glibc-build# mv -v /tools/bin/{ld-new,ld}
`/tools/bin/ld-new' -> `/tools/bin/ld'
root:/sources/glibc-build# ln -sv /tools/bin/ld /tools/$(gcc -dumpmachine)/bin/ld
create symbolic link `/tools/i686-pc-linux-gnu/bin/ld' to `/tools/bin/ld'
root:/sources/glibc-build#
接下来,修正 GCC 的 specs 文件,使它指向新的动态链接器,这样 GCC 才能知道在哪能发现开始文件。应用一个 perl 命令:
gcc -dumpspecs | \
perl -p -e 's@/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@g;' \
-e 's@\*startfile_prefix_spec:\n@$_/usr/lib/ @g;' > \
`dirname $(gcc --print-libgcc-file-name)`/specs
修改之后,用你的眼睛亲自检查一下 specs 文件,确保已经改正确了。
root:/sources/glibc-build# gcc -dumpspecs | \
> perl -p -e 's@/tools/lib/ld-linux.so.2@/lib/ld-linux.so.2@g;' \
> -e 's@\*startfile_prefix_spec:\n@$_/usr/lib/ @g;' > \
> `dirname $(gcc --print-libgcc-file-name)`/specs
重要
如果你的系统平台上,动态连接器的名字不是 ld-linux.so.2 ,你必须把上面命令里的"ld-linux.so.2"换成你的系统平台上动态连接器的名字。若有必要,请参见“工具链技术说明”。
现在有必要停下来,检查一下新工具链的基本功能(编译和连接)是否正常,我们进行一个简单的合理性检查:
root:/sources/glibc-build# echo 'main(){}' > dummy.c
root:/sources/glibc-build# cc dummy.c -Wl,--verbose &> dummy.log
root:/sources/glibc-build# readelf -l a.out | grep ': /lib'
[Requesting program interpreter: /lib/ld-linux.so.2]
root:/sources/glibc-build#
如果一切正常,应该不会出错,而且最后一个命令的结果应该是(某些特殊平台上动态连接器的名称可能与此处不同):
[Requesting program interpreter: /lib/ld-linux.so.2]
注意,/lib 应该是动态连接器的前缀。
现在确保我们设置使用正确的开始文件:
root:/sources/glibc-build# grep -o '/usr/lib.*/crt[1in].* .*' dummy.log
/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
root:/sources/glibc-build#
如果一切正常,应该不会出错,而且最后一个命令的结果应该是:
/usr/lib/crt1.o succeeded
/usr/lib/crti.o succeeded
/usr/lib/crtn.o succeeded
接下来要做的是验证新的链接器是否在正确的搜索路径内:
root:/sources/glibc-build# grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");
root:/sources/glibc-build#
如果一切正常,应该不会出错,而且最后一个命令的结果应该是:
SEARCH_DIR("/tools/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/lib")
SEARCH_DIR("/lib");
下面,确保我们是否正在使用正确的 libc:
root:/sources/glibc-build# grep "/lib/libc.so.6 " dummy.log
attempt to open /lib/libc.so.6 succeeded
root:/sources/glibc-build#
如果一切正常,应该不会出错,而且最后一个命令的结果应该是:
attempt to open /lib/libc.so.6 succeeded
最后,确保 GCC 正在使用正确的动态链接器:
root:/sources/glibc-build# grep found dummy.log
found ld-linux.so.2 at /lib/ld-linux.so.2
root:/sources/glibc-build#
如果一切正常,应该不会出错,而且最后一个命令的结果应该是(某些特殊平台上动态连接器的名称可能与此处不同):
found ld-linux.so.2 at /lib/ld-linux.so.2
如 果输出与上面不同或者没有输出,那么就有大问题了。你需要检查一下前面的操作,看看问题出在哪里,并改正过来。在改正之前,不要继续后面的部份,因为没什 么意义。大多数情况下,出错都是因为上面的 specs 文件没改对。当然,如果你的平台上动态连接器的名字不是 ld-linux.so.2 ,上面的结果也会不同。在继续之前要解决所有的问题。
在确定一切正常后,删除测试文件:
root:/sources/glibc-build# rm -v dummy.c a.out dummy.log
removed `dummy.c'
removed `a.out'
removed `dummy.log'
root:/sources/glibc-build#
11.Binutils-2.16.1
Binutils 是一组开发工具,包括连接器、汇编器和其他用于目标文件和档案的工具。
预计编译时间: 1.5 SBU (含测试套件)
所需磁盘空间: 172 MB (含测试套件)
安装Binutils
现在我们测试一下在 chroot 环境中,你的伪终端(PTY)是否正常工作。运行下面的命令:
root:/sources/glibc-build# expect -c "spawn ls"
spawn ls
root:/sources/glibc-build#
如果看到这样的输出:
The system has no more ptys.
Ask your system administrator to create more.
说明你的chroot环境还没有设置好 PTY,这时运行 Binutils 和 GCC 的测试套件就没有意义了,你必须先解决 PTY 设置。
root:/sources/glibc-build# mkdir $LFS/sources/old2
root:/sources/glibc-build# mv $LFS/sources/binutils-2.16.1 $LFS/sources/old2
root:/sources/glibc-build# mv $LFS/sources/binutils-build $LFS/sources/old2
root:/sources/glibc-build# tar -jxvf $LFS/sources/binutils-2.16.1.tar.bz2 -C $LFS/sources
root:/sources/glibc-build# cd $LFS/sources/binutils-2.16.1
Binutils 的文档推荐用一个新建的目录来编译它,而不是在源码目录中:
root:/sources/binutils-2.16.1# mkdir -v ../binutils-build
mkdir: created directory `../binutils-build'
root:/sources/binutils-2.16.1# cd ../binutils-build
root:/sources/binutils-build#
为编译 Binutils 做准备:
root:/sources/binutils-build# ../binutils-2.16.1/configure --prefix=/usr \
> --enable-shared
编译软件包:
root:/sources/binutils-build# make tooldir=/usr (开始于2006-11-13 23:19:17)
(结束于2006-11-13 23:26:37)
make 参数的含义:
tooldir=/usr 通常情况下,tooldir(可执行文件的安装目录) 是 $(exec_prefix)/$(target_alias)。例如在 i686 机器上,将是 tt class="filename">/usr/i686-pc-linux-gnu 。因为我们只为自己的系统进行编译,就并不需要在 /usr 目录后面再存在特殊的后缀。$(exec_prefix)/$(target_alias) 只是在交叉编译时(比如在 Intel 机器上编译将要在 PowerPC 上执行的程序)才用到。
重要
本节的 Binutils 测试套件很重要。在任何情况下都不要省略这一步。
对结果进行测试:
root:/sources/binutils-build# make check
……
……
……
Running /sources/binutils-2.16.1/ld/testsuite/ld-xstormy16/xstormy16.exp ...
Running /sources/binutils-2.16.1/ld/testsuite/ld-xtensa/coalesce.exp ...
Running /sources/binutils-2.16.1/ld/testsuite/ld-xtensa/lcall.exp ...
=== ld Summary ===
# of expected passes 243
# of expected failures 4
/sources/binutils-build/ld/ld-new 2.16.1
make[3]: Leaving directory `/sources/binutils-build/ld'
make[2]: Leaving directory `/sources/binutils-build/ld'
make[1]: Leaving directory `/sources/binutils-build/ld'
make[1]: Entering directory `/sources/binutils-build/libiberty'
make[2]: Entering directory `/sources/binutils-build/libiberty/testsuite'
gcc -DHAVE_CONFIG_H -g -O2 -I.. -I../../../binutils-2.16.1/libiberty/testsuite/../../include -o test-demangle \
../../../binutils-2.16.1/libiberty/testsuite/test-demangle.c ../libiberty.a
./test-demangle < ../../../binutils-2.16.1/libiberty/testsuite/demangle-expected./test-demangle: 746 tests, 0 failures
make[2]: Leaving directory `/sources/binutils-build/libiberty/testsuite'
make[1]: Leaving directory `/sources/binutils-build/libiberty'
root:/sources/binutils-build#
安装软件包:
root:/sources/binutils-build# make tooldir=/usr install
安装某些软件包需要的 libiberty 头文件:
root:/sources/binutils-build# cp -v ../binutils-2.16.1/include/libiberty.h /usr/include
`../binutils-2.16.1/include/libiberty.h' -> `/usr/include/libiberty.h'
root:/sources/binutils-build#
Binutils 的内容
安装的程序: addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings, strip
安装的库: libiberty.a, libbfd.{a,so}, libopcodes.{a,so}
简要描述
addr2line |
把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。 |
ar |
建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。 |
as |
一个汇编器,用来汇编 gcc 的输出,产生的目标文件然后由接器 ld 连接。 |
c++filt |
连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。 |
gprof |
显示程序调用段的各种数据。 |
ld |
连接器,它把一些目标和归档文件结合为一个文件,重定位数据,并链接符号引用。通常,建立一个新编译程序的最后一步就是调用 ld 。/p> |
nm |
列出出现在目标文件中的符号 |
objcopy |
把一种目标文件中的内容复制到另一种类型的目标文件中 |
objdump |
显示所给目标文件的信息。使用选项来控制其显示的信息。它所显示的信息通常只有编写编译工具的人才感兴趣。 |
ranlib |
产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。 |
readelf |
显示 ELF 格式可执行文件的信息 |
size |
列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。 |
strings |
打印某个文件的可打印字符串,这些字符串最少 4 个字符长,也可以使用选项"-n"设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其它类型的文件它打印整个文件的可打印字符,这个程序对于了解非文本文件的内容很有帮助。 |
strip |
删除目标文件中的全部或者特定符号 |
libiberty |
包含许多GNU程序都会用到的函数,这些程序有: getopt, obstack, strerror, strtol, 和 strtoul |
libbfd |
二进制文件描述库 |
libopcodes |
用来处理 opcodes("可读文本格式的")处理器操作指令)的库,在生成一些应用程序的时候也会用到它,比如 objdump 。 |
12.GCC-4.0.3
GCC 软件包包含 GNU 编译器,其中有 C 和 C++ 编译器。
预计编译时间: 22 SBU (含测试套件)
所需磁盘空间: 566 MB (含测试套件)
安装GCC
root:/sources/binutils-build# mv $LFS/sources/gcc-4.0.3 $LFS/sources/old2
root:/sources/binutils-build# mv $LFS/sources/gcc-build $LFS/sources/old2
root:/sources/binutils-build# tar -jxvf $LFS/sources/gcc-4.0.3.tar.bz2 -C $LFS/sources
root:/sources/binutils-build# cd $LFS/sources/gcc-4.0.3
使用一个 sed 命令来禁止 GCC 安装它自己的 libiberty.a 。我们将使用 Binutils 附带的 libiberty.a 来代替:
root:/sources/gcc-4.0.3# sed -i 's/install_to_$(INSTALL_DEST) //' libiberty/Makefile.in
在“GCC-4.0.3 - 第一遍”中应用的 bootstrap 编译中,编译器会有 -fomit-frame-pointer 的标志。非bootstrap编译默认是忽略这个标志的,可以应用下面的sed 命令来确保编译的可靠性。
root:/sources/gcc-4.0.3# sed -i 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in
fixincludes 脚本偶尔会因为修改系统的头文件而出错。因为GCC-4.0.3 和 Glibc-2.3.6 是不需要修改的,运行下面的命令可以避免 fixincludes 脚本运行:
root:/sources/gcc-4.0.3# sed -i 's@\./fixinc\.sh@-c true@' gcc/Makefile.in
GCC 中提供了一个 gccbug 脚本,会在编译时侦测 mktemp 是否存在,并且在测试中加强代码。这将会导致脚本使用一些不算很随机的名字来命名临时文件。因为我们后面会安装 mktemp ,这里我们就模仿它的存在:
root:/sources/gcc-4.0.3# sed -i 's/@have_mktemp_command@/yes/' gcc/gccbug.in
GCC 的安装指南推荐用一个新建的目录来编译它,而不是在源码目录中:
root:/sources/gcc-4.0.3# mkdir -v ../gcc-build
mkdir: created directory `../gcc-build'
root:/sources/gcc-4.0.3# cd ../gcc-build
root:/sources/gcc-build#
为编译GCC做准备:
root:/sources/gcc-build# ../gcc-4.0.3/configure --prefix=/usr \
> --libexecdir=/usr/lib --enable-shared \
> --enable-threads=posix --enable-__cxa_atexit \
> --enable-clocale=gnu --enable-languages=c,c++
编译软件包:
root:/sources/gcc-build# make && date +%c (开始于2006-11-13 23:50:02)
……
……
……
make[4]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
make[3]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
make[2]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
make[1]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
Mon Nov 13 16:16:15 2006 (结束于2006-11-14 00:16:15)
root:/sources/gcc-build#
重要
本节的GCC测试套件很重要。在任何情况下都不要省略这一步。
运行测试套件,但遇到错误不停止(你还记得那些老是出错的测试吧):
root:/sources/gcc-build# make -k check && date +%c (开始于2006-11-14 00:19:29)
……
……
……
WARNING: Couldn't find the global config file.
Test Run By root on Mon Nov 13 17:48:35 2006
Native configuration is i686-pc-linux-gnu
=== libmudflap tests ===
Schedule of variations:
unix
Running target unix
Using /tools/share/dejagnu/baseboards/unix.exp as board description file for target.
Using /tools/share/dejagnu/config/unix.exp as generic interface file for target.Using /sources/gcc-4.0.3/libmudflap/testsuite/config/default.exp as tool-and-target-specific interface file.
Running /sources/gcc-4.0.3/libmudflap/testsuite/libmudflap.c/cfrags.exp ...
Running /sources/gcc-4.0.3/libmudflap/testsuite/libmudflap.c++/c++frags.exp ...
Running /sources/gcc-4.0.3/libmudflap/testsuite/libmudflap.c++/ctors.exp ...
Running /sources/gcc-4.0.3/libmudflap/testsuite/libmudflap.cth/cthfrags.exp ...
FAIL: libmudflap.cth/pass40-frag.c execution test
FAIL: libmudflap.cth/pass40-frag.c output pattern test
FAIL: libmudflap.cth/pass40-frag.c (-O2) execution test
FAIL: libmudflap.cth/pass40-frag.c (-O2) output pattern test
FAIL: libmudflap.cth/pass40-frag.c (-O3) execution test
FAIL: libmudflap.cth/pass40-frag.c (-O3) output pattern test
=== libmudflap Summary ===
# of expected passes 1282
# of unexpected failures 6
make[3]: *** [check-DEJAGNU] Error 1
make[3]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap/testsuite'
make[2]: *** [check-am] Error 2
make[2]: Target `check' not remade because of errors.
make[2]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap/testsuite'
make[2]: Entering directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
make "AR_FLAGS=rc" "CC_FOR_BUILD=gcc" "CFLAGS=-O2 -g -O2 " "CXXFLAGS=-g -O2 -D_GNU_SOURCE" "CFLAGS_FOR_BUILD=" "CFLAGS_FOR_TARGET=-O2 -g -O2 " "INSTALL=/tools/bin/install -c" "INSTALL_DATA=/tools/bin/install -c -m 644" "INSTALL_PROGRAM=/tools/bin/install -c" "INSTALL_SCRIPT=/tools/bin/install -c" "JC1FLAGS=" "LDFLAGS=" "LIBCFLAGS=-O2 -g -O2 " "LIBCFLAGS_FOR_TARGET=-O2 -g -O2 " "MAKE=make" "MAKEINFO=makeinfo --split-size=5000000 " "PICFLAG=" "PICFLAG_FOR_TARGET=" "SHELL=/bin/sh" "RUNTESTFLAGS=" "exec_prefix=/usr" "infodir=/usr/info" "libdir=/usr/lib" "prefix=/usr" "AR=ar" "AS=as" "CC=/sources/gcc-build/gcc/xgcc -B/sources/gcc-build/gcc/ -B/usr/i686-pc-linux-gnu/bin/ -B/usr/i686-pc-linux-gnu/lib/ -isystem /usr/i686-pc-linux-gnu/include -isystem /usr/i686-pc-linux-gnu/sys-include" "CXX=/sources/gcc-build/gcc/g++ -B/sources/gcc-build/gcc/ -nostdinc++ -nostdinc++ -I/sources/gcc-build/i686-pc-linux-gnu/libstdc++-v3/include/i686-pc-linux-gnu -I/sources/gcc-build/i686-pc-linux-gnu/libstdc++-v3/include -I/sources/gcc-4.0.3/libstdc++-v3/libsupc++ -I/sources/gcc-4.0.3/libstdc++-v3/include/backward -I/sources/gcc-4.0.3/libstdc++-v3/testsuite -L/sources/gcc-build/i686-pc-linux-gnu/libstdc++-v3/src -L/sources/gcc-build/i686-pc-linux-gnu/libstdc++-v3/src/.libs -B/usr/i686-pc-linux-gnu/bin/ -B/usr/i686-pc-linux-gnu/lib/ -isystem /usr/i686-pc-linux-gnu/include -isystem /usr/i686-pc-linux-gnu/sys-include" "LD=ld" "LIBCFLAGS=-O2 -g -O2 " "NM=nm" "PICFLAG=" "RANLIB=ranlib" "DESTDIR=" DO=all multi-do # make
make[3]: Entering directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
if [ -z "" ]; then \
true; \
else \
rootpre=`${PWDCMD-pwd}`/; export rootpre; \
srcrootpre=`cd ../../../gcc-4.0.3/libmudflap; ${PWDCMD-pwd}`/; export srcrootpre; \
lib=`echo ${rootpre} | sed -e 's,^.*/\([^/][^/]*\)/$,\1,'`; \
compiler="/sources/gcc-build/gcc/xgcc -B/sources/gcc-build/gcc/ -B/usr/i686-pc-linux-gnu/bin/ -B/usr/i686-pc-linux-gnu/lib/ -isystem /usr/i686-pc-linux-gnu/include -isystem /usr/i686-pc-linux-gnu/sys-include"; \
for i in `${compiler} --print-multi-lib 2>/dev/null`; do \
dir=`echo $i | sed -e 's/;.*$//'`; \
if [ "${dir}" = "." ]; then \
true; \
else \
if [ -d ../${dir}/${lib} ]; then \
flags=`echo $i | sed -e 's/^[^;]*;//' -e 's/@/ -/g'`; \
if (cd ../${dir}/${lib}; make \
CFLAGS="-O2 -g -O2 ${flags}" \
FCFLAGS=" ${flags}" \
FFLAGS=" ${flags}" \
ADAFLAGS=" ${flags}" \
prefix="/usr" \
exec_prefix="/usr" \
GCJFLAGS=" ${flags}" \
CXXFLAGS="-g -O2 -D_GNU_SOURCE ${flags}" \
LIBCFLAGS="-O2 -g -O2 ${flags}" \
LIBCXXFLAGS="-g -O2 -D_GNU_SOURCE -fno-implicit-templates ${flags}" \
LDFLAGS=" ${flags}" \
MULTIFLAGS="${flags}" \
DESTDIR="" \
INSTALL="/tools/bin/install -c" \
INSTALL_DATA="/tools/bin/install -c -m 644" \
INSTALL_PROGRAM="/tools/bin/install -c" \
INSTALL_SCRIPT="/tools/bin/install -c" \
all); then \
true; \
else \
exit 1; \
fi; \
else true; \
fi; \
fi; \
done; \
fi
make[3]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
make[2]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
make[1]: *** [check-recursive] Error 1
make[1]: Target `check' not remade because of errors.
make[1]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
make: *** [check-target-libmudflap] Error 2
make[1]: Entering directory `/sources/gcc-build/i686-pc-linux-gnu/libiberty'
make[2]: Entering directory `/sources/gcc-build/i686-pc-linux-gnu/libiberty/testsuite'
make[2]: Nothing to be done for `check'.
make[2]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libiberty/testsuite'
make[1]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libiberty'
make: Target `check' not remade because of errors.
root:/sources/gcc-build#
要查看测试单元的测试结果,可以运行:
root:/sources/gcc-build# ../gcc-4.0.3/contrib/test_summary
cat <<'EOF' |
LAST_UPDATED: Obtained from SVN: tags/gcc_4_0_3_release revision 111908
Native configuration is i686-pc-linux-gnu
=== g++ tests ===
Running target unix
XPASS: g++.old-deja/g++.other/init5.C execution test
=== g++ Summary ===
# of expected passes 11463
# of unexpected successes 1
# of expected failures 69
# of unsupported tests 56
/sources/gcc-build/gcc/testsuite/../g++ version 4.0.3
=== gcc tests ===
Running target unix
XPASS: gcc.dg/cpp/cmdlne-dI-M.c scan-file (^|\\\\n)cmdlne-dI-M.*:[^\\\\n]*cmdlne-dI-M.c
XPASS: gcc.dg/cpp/cmdlne-dM-M.c scan-file (^|\\\\n)cmdlne-dM-M[^\\\\n]*:[^\\\\n]*cmdlne-dM-M.c
XPASS: gcc.dg/vect/vect-22.c scan-tree-dump-times vectorized 3 loops 1
=== gcc Summary ===
# of expected passes 35544
# of unexpected successes 3
# of expected failures 92
# of untested testcases 28
# of unsupported tests 326
/sources/gcc-build/gcc/xgcc version 4.0.3
=== libmudflap tests ===
Running target unix
FAIL: libmudflap.cth/pass40-frag.c execution test
FAIL: libmudflap.cth/pass40-frag.c output pattern test
FAIL: libmudflap.cth/pass40-frag.c (-O2) execution test
FAIL: libmudflap.cth/pass40-frag.c (-O2) output pattern test
FAIL: libmudflap.cth/pass40-frag.c (-O3) execution test
FAIL: libmudflap.cth/pass40-frag.c (-O3) output pattern test
=== libmudflap Summary ===
# of expected passes 1282
# of unexpected failures 6
=== libstdc++ tests ===
Running target unix
XPASS: 22_locale/locale/cons/12658_thread-1.cc execution test
XPASS: 26_numerics/cmath/c99_classification_macros_c.cc (test for excess errors)
=== libstdc++ Summary ===
# of expected passes 3713
# of unexpected successes 2
# of expected failures 12
Compiler version: 4.0.3
Platform: i686-pc-linux-gnu
configure flags: --prefix=/usr --libexecdir=/usr/lib --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu --enable-languages=c,c++
EOF
Mail -s "Results for 4.0.3 testsuite on i686-pc-linux-gnu" [email protected] &&
mv /sources/gcc-build/./gcc/testsuite/g++.sum /sources/gcc-build/./gcc/testsuite/g++.sum.sent &&
mv /sources/gcc-build/./gcc/testsuite/gcc.sum /sources/gcc-build/./gcc/testsuite/gcc.sum.sent &&
mv /sources/gcc-build/./i686-pc-linux-gnu/libmudflap/testsuite/libmudflap.sum /sources/gcc-build/./i686-pc-linux-gnu/libmudflap/testsuite/libmudflap.sum.sent &&mv /sources/gcc-build/./i686-pc-linux-gnu/libstdc++-v3/testsuite/libstdc++.sum /sources/gcc-build/./i686-pc-linux-gnu/libstdc++-v3/testsuite/libstdc++.sum.sent &&
mv /sources/gcc-build/./gcc/testsuite/g++.log /sources/gcc-build/./gcc/testsuite/g++.log.sent &&
mv /sources/gcc-build/./gcc/testsuite/gcc.log /sources/gcc-build/./gcc/testsuite/gcc.log.sent &&
mv /sources/gcc-build/./i686-pc-linux-gnu/libmudflap/testsuite/libmudflap.log /sources/gcc-build/./i686-pc-linux-gnu/libmudflap/testsuite/libmudflap.log.sent &&mv /sources/gcc-build/./i686-pc-linux-gnu/libstdc++-v3/testsuite/libstdc++.log /sources/gcc-build/./i686-pc-linux-gnu/libstdc++-v3/testsuite/libstdc++.log.sent &&
true
root:/sources/gcc-build#
如果只想看概要,可以把输出通过管道传递给 grep -A7 Summ 。
结果可以跟 http://www.linuxfromscratch.org/lfs/build-logs/6.2/ 的进行比较。
From URL:http://www.linuxfromscratch.org/lfs/build-logs/6.2/PIII-500/chapter6/gcc
|
一些预想不到的错误总是无法避免的。虽然GCC的开发者经常留意这些问题,但是有些还是没有得到解决。通常,libmudflap 测试尤其被认为是有问题的(这是一个bug,参见http://gcc.gnu.org/bugzilla/show_bug.cgi?id=20003)。 除非测试结果与上面URL的有很多不同,一般是可以安全继续的。
安装软件包:
root:/sources/gcc-build# make install
……
……
……
Libraries have been installed in:
/usr/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
/bin/sh ./libtool --mode=install /tools/bin/install -c 'libmudflapth.la' '/usr/lib/libmudflapth.la'
/tools/bin/install -c .libs/libmudflapth.so.0.0.0 /usr/lib/libmudflapth.so.0.0.0(cd /usr/lib && rm -f libmudflapth.so.0 && ln -s libmudflapth.so.0.0.0 libmudflapth.so.0)
(cd /usr/lib && rm -f libmudflapth.so && ln -s libmudflapth.so.0.0.0 libmudflapth.so)
/tools/bin/install -c .libs/libmudflapth.lai /usr/lib/libmudflapth.la
/tools/bin/install -c .libs/libmudflapth.a /usr/lib/libmudflapth.a
ranlib /usr/lib/libmudflapth.a
chmod 644 /usr/lib/libmudflapth.a
PATH="$PATH:/sbin" ldconfig -n /usr/lib
----------------------------------------------------------------------
Libraries have been installed in:
/usr/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,--rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
test -z "/usr/include" || mkdir -p -- "/usr/include"
/tools/bin/install -c -m 644 '../../../gcc-4.0.3/libmudflap/mf-runtime.h' '/usr/include/mf-runtime.h'
make[3]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
make[2]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
make[1]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libmudflap'
make[1]: Entering directory `/sources/gcc-build/i686-pc-linux-gnu/libiberty'
make[2]: Entering directory `/sources/gcc-build/i686-pc-linux-gnu/libiberty/testsuite'
make[2]: Nothing to be done for `install'.
make[2]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libiberty/testsuite'
make[1]: Leaving directory `/sources/gcc-build/i686-pc-linux-gnu/libiberty'
root:/sources/gcc-build#
有的软件包希望 C PreProcessor(预处理器)安装在 /lib 目录下,为了满足它们的要求,我们创建如下符号链接:
root:/sources/gcc-build# ln -sv ../usr/bin/cpp /lib
create symbolic link `/lib/cpp' to `../usr/bin/cpp'
root:/sources/gcc-build#
许多软件包使用 cc 作为 C 编译器的名字,为了满足它们的要求,创建如下符号链接:
root:/sources/gcc-build# ln -sv gcc /usr/bin/cc
create symbolic link `/usr/bin/cc' to `gcc'
root:/sources/gcc-build#
现在,我们的最终工具链已经形成了,我们需要做的就是确保编译、链接按照我们希望的完成。我们可以通过本章前面的简册方法来实现:
root:/sources/gcc-build# echo 'main(){}' > dummy.c
root:/sources/gcc-build# cc dummy.c -Wl,--verbose &> dummy.log
root:/sources/gcc-build# readelf -l a.out | grep ': /lib'
[Requesting program interpreter: /lib/ld-linux.so.2]
root:/sources/gcc-build#
如果所有的都工作正常,就不会有错误,并且命令的输出应该是(允许不同平台的动态链接器的名称不同):
[Requesting program interpreter: /lib/ld-linux.so.2]
现在确保我们使用正确的 startfiles:
root:/sources/gcc-build# grep -o '/usr/lib.*/crt[1in].* .*' dummy.log
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crtn.o succeeded
root:/sources/gcc-build#
如果所有的都工作正常,就不会有错误,并且命令的输出应该是:
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crt1.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crti.o succeeded
/usr/lib/gcc/i686-pc-linux-gnu/4.0.3/../../../crtn.o succeeded
接下来,确认新的链接器被应用到了正确的搜索路径中:
root:/sources/gcc-build# grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
root:/sources/gcc-build#
如果所有的都工作正常,就不会有错误,并且命令的输出应该是:
SEARCH_DIR("/usr/i686-pc-linux-gnu/lib")
SEARCH_DIR("/usr/local/lib")
SEARCH_DIR("/lib")
SEARCH_DIR("/usr/lib");
现在,确保我们正在使用正确的 libc :
root:/sources/gcc-build# grep "/lib/libc.so.6 " dummy.log
attempt to open /lib/libc.so.6 succeeded
root:/sources/gcc-build#
如果所有的都工作正常,就不会有错误,并且命令的输出应该是
attempt to open /lib/libc.so.6 succeeded
最后,确保 GCC 正在使用正确的动态链接器:
root:/sources/gcc-build# grep found dummy.log
found ld-linux.so.2 at /lib/ld-linux.so.2
root:/sources/gcc-build#
如果所有的都工作正常,就不会有错误,并且命令的输出应该是(允许不同平台的动态链接器的名称不同):
found ld-linux.so.2 at /lib/ld-linux.so.2
如果输出不是像上面那样或者根本没有输出,那么就有大问题了。返回并检查前面的操作,找出问题,并改正过来。最有可能的原因是上面修正 specs 文件时出错。任何一个问题都需要在继续之前解决掉。
一旦工具都工作正常,清理测试文件:
root:/sources/gcc-build# rm -v dummy.c a.out dummy.log
removed `dummy.c'
removed `a.out'
removed `dummy.log'
root:/sources/gcc-build#
GCC 的内容
安装的程序: c++, cc(→gcc), cpp, g++, gcc, gccbug, gcov
安装的库: libgcc.a, libgcc_eh.a, libgcc_s.so, libstdc++.{a,so}, libsupc++.a
简要描述
cc |
C 编译器 |
cpp |
C 预处理器。编译器用它来将 #include 和 #define 这类声明在源文件中展开。 |
c++ |
C++ 编译器 |
g++ |
C++ 编译器 |
gcc |
C 编译器 |
gccbug |
一个shell脚本,帮助创建有价值的 bug 报告。 |
gcov |
覆盖测试工具,用来分析在程序的哪里做优化的效果最好。 |
libgcc |
gcc 的运行时库 |
libstdc++ |
准 C++ 库,包含许多常用的函数。 |
libsupc++ |
为 C++ 语言提供支持的库函数。 |