顺利编译 binutiles-gcc-glibc
恩,前面一篇弃了,先知道怎么能成功,还有要避开哪些坑,然后再去仔细研究到底咋回事。
这里顺利编译 arm-lfs-linux-gnueabi , 参考了下面的资料:
1. 《Linux From ScratchVersion 7.3》
2. http://www.cnblogs.com/Charles-Zhang-Blog/archive/2013/02/21/2920999.html
3. https://gcc.gnu.org/wiki/FAQ#configure
4. http://preshing.com/20141119/how-to-build-a-gcc-cross-compiler/
就写这么多吧,其实还 google 了其它很多资料。上面资料重要性依次顺推。
使用的源码列表:
1. binutils-2.22.tar.bz2, 补丁 binutils-2.22-build_fix-1.patch
2. gcc-4.7.1.tar.bz2,编译中,有按照资料 1 做修改。
3. linux-3.2.6.tar.xz
4. glibc-2.16.0.tar.xz,补丁 glibc-2.16.0-res_query_fix-1.patch,ports 包 glibc-ports-2.16.0.tar.gz
1. 编译 binutiles
这里一般都很顺利,基本思路就是,利用本机的 gcc 和 binutiles,制作一个在本地执行的针对目标 CPU 的 binutiles。这里使用的配置选项有
../configure \
--prefix=/tools \
--with-sysroot=/mnt/lfs/ \
--with-lib-path=/tools/lib \
--target=arm-lfs-linux-gnueabi \
--disable-nls
这里也是有坑的,gnueabi 部分,这个命名是不可以自由发挥的,gcc 和 glibc 都会根据这个名字去做匹配。如果这个名字匹配不到,会出很多莫名其妙问题,比如,我开始的时候自己发挥的 gnueabihf,在编译 gcc 的时候,ld 总是提示找不到这找不到那。因为我后来查看( ld --verbose,查看 ld 的各种信息),这个版本的链接器只认这个:
GNU ld (GNU Binutils) 2.22
Supported emulations:
armelf_linux_eabi
armelfb_linux_eabi
using internal linker script:
...
它在链接的时候,认不了 eabihf。
2. 编译 gcc
事实上,我们要编译的 arm-lfs-linux-gnueabi-gcc 是在本机运行的,所以,它执行的环境使用本机的 gcc 和 binutiles 就可以构建。但是,arm-lfs-linux-gnueabi-gcc 里面有针对目标系统ld、as 的硬链接,所以,binutiles 要先准备好。另外,还不知道为什么,最近的工具链编译文档都推荐使用 -with-newlib。编译这个库是需要链接工具的。
按照文档 1 所描述的方法,修改了 gcc 的源码。因为文档1只涉及 x86,所以,同样的,我还手动修改了$SRC/gcc/config/arm/ 下的 linux-eabi.h 和 linux-elf.h ,GLIBC_DYNAMIC_LINKER 的定义路径。
然后,是我的配置选项:
../configure \
--target=arm-lfs-linux-gnueabi \
--prefix=/tools \
--with-sysroot=/mnt/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-libmudflap \
--disable-libssp \
--disable-libgomp \
--disable-libquadmath \
--enable-languages=c
需要注意的是,target 要和上面 binutiles 的一致。编译过程中,配置脚本会去 $prefixe/bin 目录下,寻找同样前缀的 binutiles 工具。找不到,就会用本机的 binutiles,也不会提示错误,但是 make 就是各种有问题。
另外,推荐下面的编译过程:
make all-gcc
make install all-gcc
make all-target-libgcc
make install-target-libgcc
分步骤定位问题,如果是 all-target-ligbcc 无法编译,那估计是 linker 的问题(ld)。
3. 准备 linux-header
呵呵,参考了很多文档,大家取 linux-header 的手法都不一样,千奇百怪,还说要编译过才能取云云。
继续参考文档 1 ,但是,我这里去的内核是跟我主机的版本内核一致的,并没选文档中推荐的版本。但是,另个差不多,应该关系不大。
下载来内核包并解压后:
make mrproper make headers_check
make INSTALL_HDR_PATH=dest headers_install
make ARCH=arm INSTALL_HDR_PATH=dest_arm headers_install
然后,把 dest( dest_arm )目录下的文档拷贝到需要的地方即可。
4. 编译 glibc
按文档 1 的描述对代码进行了处理。这里主要是把 Makeconfig 文件中的 -lgcc_s 做了删除操作。因为我们的 gcc 是静态编译,并没有 libgcc.s ,但是,Makeconfig 其实是可以用我们在上一步产生的 libgcc.a 来完成编译的(也因为这,需要在 libgcc.a 同目录下,建一个软链接 libgcc_eh.a 到它)。
下面是我的 configure 选项:
../configure \
--prefix=/tools \
--host=arm-lfs-linux-gnueabi \
--build=$(../scripts/config.guess) \
--disable-profile \
--enable-add-ons \
--enable-kernel=2.6. \
--with-headers=/tools/include \
libc_cv_forced_unwind=yes \
libc_cv_ctors_header=yes \
libc_cv_c_cleanup=yes \
libc_cv_arm_pcs_vfp=yes \
libc_cv_arm_eabi=yes
需要注意,这里会根据 --host=arm-lfs-linux-gnueabi 来选择编译 gcc 需要的工具!所以,我们要在这里 configure 之前,把前面工具的目录添加到 PATH 中:
exprot PATH=$PATH:/tools/bin/
make&make install
同样,会因为工具链命名的问题,产生很多奇怪的错误。
5. 工具连测试
首先,如果可以顺利编译,起码是有一大半是成功的
$ echo 'main(){}' > dummy.c
$ arm-linux-gnueabi-gcc dummy.c
$ readelf -l a.out| grep tools
/tools/lib/ld-linux.so.3
然后,看到连接库指向的是 /tools/lib/ld-linux.so.3 ,正是我们刚刚编译 glibc 得到的。
另外,查看 /tools/lib/ld-linux.so.3 的 elf 信息,工具对 cpu 的支持情况等,也都一目了然。
...
Version definition section '.gnu.version_d' contains entries:
Addr: 0x0000000000000608 Offset: 0x000608 Link: (.dynstr) : Rev: Flags: BASE Index: Cnt: Name: ld-linux.so.
0x001c: Rev: Flags: none Index: Cnt: Name: GLIBC_2.
0x0038: Rev: Flags: none Index: Cnt: Name: GLIBC_PRIVATE
0x0054: Parent : GLIBC_2.
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "ARM10TDMI"
Tag_CPU_arch: v5T
Tag_ARM_ISA_use: Yes
Tag_THUMB_ISA_use: Thumb-
Tag_ABI_PCS_wchar_t:
Tag_ABI_FP_rounding: Needed
Tag_ABI_FP_denormal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE
Tag_ABI_align_needed: -byte
Tag_ABI_align_preserved: -byte, except leaf SP
Tag_ABI_enum_size: int
Tag_ABI_optimization_goals: Aggressive Speed
Tag_DIV_use: Not allowed
因为这个过程中,并没有指定 CPU 的信息,所以,默认 ARM10TDMI 这个适应性最广的内核。但是,还不知道这里为什么 GLIBC 的版本是 2.4?不过,看了手上几个交叉编译工具,他们 ld-linux.so.x 文件,打印出的也都是 GLIBC_2.4。
不确定的话,还可以用 gcc -v dummy.c 来看看 compile 和 link 的详细搜索信息:
Using built-in specs.
COLLECT_GCC=/tools/bin/arm-lfs-linux-gnueabi-gcc
COLLECT_LTO_WRAPPER=/mnt/lfs/tools/bin/../libexec/gcc/arm-lfs-linux-gnueabi/4.7./lto-wrapper
Target: arm-lfs-linux-gnueabi
Configured with: ../configure --target=arm-lfs-linux-gnueabi --prefix=/tools --with-sysroot=/mnt/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-libmudflap --disable-libssp --disable-libgomp --disable-libquadmath --enable-languages=c
Thread model: single
gcc version 4.7. (GCC)
COLLECT_GCC_OPTIONS='-v' '-mtls-dialect=gnu'
/mnt/lfs/tools/bin/../libexec/gcc/arm-lfs-linux-gnueabi/4.7./cc1 -quiet -v -iprefix /mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7./ dummy.c -quiet -dumpbase dummy.c -mtls-dialect=gnu -auxbase dummy -version -o /tmp/ccM0ks0K.s
GNU C (GCC) version 4.7. (arm-lfs-linux-gnueabi)
compiled by GNU C version 4.6., GMP version 4.3., MPFR version 2.4., MPC version 0.8.
GGC heuristics: --param ggc-min-expand= --param ggc-min-heapsize=
ignoring nonexistent directory "/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/../../../../arm-lfs-linux-gnueabi/include"
ignoring duplicate directory "/mnt/lfs/tools/bin/../lib/gcc/../../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/include"
ignoring duplicate directory "/mnt/lfs/tools/bin/../lib/gcc/../../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/include-fixed"
ignoring nonexistent directory "/mnt/lfs/tools/bin/../lib/gcc/../../lib/gcc/arm-lfs-linux-gnueabi/4.7.1/../../../../arm-lfs-linux-gnueabi/include"
ignoring duplicate directory "/mnt/lfs/tools/include"
#include "..." search starts here:
#include <...> search starts here:
/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7./include
/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7./include-fixed
/mnt/lfs/tools/include
End of search list.
GNU C (GCC) version 4.7. (arm-lfs-linux-gnueabi)
compiled by GNU C version 4.6., GMP version 4.3., MPFR version 2.4., MPC version 0.8.
GGC heuristics: --param ggc-min-expand= --param ggc-min-heapsize=
Compiler executable checksum: 8984c53ee8f338d4ee7617f8ba4e1a93
COLLECT_GCC_OPTIONS='-v' '-mtls-dialect=gnu'
/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7./../../../../arm-lfs-linux-gnueabi/bin/as -v -meabi= -o /tmp/ccNzMZcr.o /tmp/ccM0ks0K.s
GNU assembler version 2.22 (arm-lfs-linux-gnueabi) using BFD version (GNU Binutils) 2.22
COMPILER_PATH=/mnt/lfs/tools/bin/../libexec/gcc/arm-lfs-linux-gnueabi/4.7./:/mnt/lfs/tools/bin/../libexec/gcc/:/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7./../../../../arm-lfs-linux-gnueabi/bin/
LIBRARY_PATH=/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7./:/mnt/lfs/tools/bin/../lib/gcc/:/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7./../../../../arm-lfs-linux-gnueabi/lib/:/mnt/lfs/tools/lib/
COLLECT_GCC_OPTIONS='-v' '-mtls-dialect=gnu'
/mnt/lfs/tools/bin/../libexec/gcc/arm-lfs-linux-gnueabi/4.7./collect2 --sysroot=/mnt/lfs/ --eh-frame-hdr -dynamic-linker /tools/lib/ld-linux.so. -X -m armelf_linux_eabi /mnt/lfs/tools/lib/crt1.o /mnt/lfs/tools/lib/crti.o /mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7./crtbegin.o -L/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7. -L/mnt/lfs/tools/bin/../lib/gcc -L/mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7./../../../../arm-lfs-linux-gnueabi/lib -L/mnt/lfs/tools/lib /tmp/ccNzMZcr.o -lgcc -lc -lgcc /mnt/lfs/tools/bin/../lib/gcc/arm-lfs-linux-gnueabi/4.7./crtend.o /mnt/lfs/tools/lib/crtn.o
6. 根据编译好的 glibc 来重做工具
写不下去了,不知道接下来要干啥哈哈哈,随便倒腾倒腾。继续制作指向新 libc 库的 gcc 和 binutils ?
还有改掉那个 linker 的路径。
反正,目标是用自制的工具作出自己的系统来,所以,还有蛮多工作要做。
7. 修改 lib 路径重新编译
这次编译就是使用工具默认的路径,没有制定 include,也没有指定 lib。使用的文件和上面一样(没有改变 gcc/config/arch/linux-**.h 里的 program interpreter,保持原来的 ld-linux.so.*),改变 configure 选项如下。同样是成功可用的。
../configure \
--prefix=/tmp/toolchains/ \
--target=arm-lfs-linux-gnueabi \
--disable-nls
-------------------------------------------------------------------------------
../configure \
--target=arm-lfs-linux-gnueabi \
--prefix=/tmp/toolchains/ \
--with-newlib \
--without-headers \
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-decimal-float \
--disable-threads \
--disable-libmudflap \
--disable-libssp \
--disable-libgomp \
--disable-libquadmath \
--enable-languages=c,c++
-------------------------------------------------------------------------------
exprot PATH=$PATH:/tmp/toolchains/bin/ ../configure \
--prefix=/tmp/toolchains/arm-lfs-linux-gnueabi/ \
--host=arm-lfs-linux-gnueabi \
--build=$(../scripts/config.guess) \
--disable-profile \
--enable-add-ons \
--enable-kernel=2.6. \
libc_cv_forced_unwind=yes \
libc_cv_ctors_header=yes \
libc_cv_c_cleanup=yes \
libc_cv_arm_pcs_vfp=yes \
libc_cv_arm_eabi=yes
测试工具,查看 program interpreter 都没有问题。
顺利编译 binutiles-gcc-glibc的更多相关文章
- 在CentOS 6.4中编译安装gcc 4.8.1
在CentOS 6.4中编译安装gcc 4.8.1 分类: C/C++ Linux/Unix2013-11-28 21:02 1877人阅读 评论(0) 收藏 举报 原文链接:http://www.c ...
- CentOS 6.4中升级编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 以及Kdump配置
在CentOS 6.4中编译安装GCC 4.8.1 + GDB 7.6.1 + Eclipse 今天在isocpp上看到"GCC 4.8.1 released, C++11 feature ...
- CentOS6编译安装gcc高版本
编译安装gcc高版本 因CentOS中gcc版本仅有4.4,故编译安装gcc高版本. 安装依赖库(如果你已安装过gcc低版本,可跳过这步) yum install glibc-static libst ...
- fedora/centos下gcc编译出现gcc: error trying to exec ‘cc1plus’: execvp: No such file or directory
fedora/centos下gcc编译出现gcc: error trying to exec 'cc1plus': execvp: No such file or directory解决办法 翻译自: ...
- CentOS编译安装GCC 4.9.2成功
在Linux上编译安装gcc是个寻烦恼的活,对于像我这样习惯于在Windows上面使用二进制安装包的人来说,自已编译安装gcc是个相当大的挑战,今天直接挑战最新版的gcc,是4.9.2版本的,做之前查 ...
- 详解C/C++ 编译 g++ gcc 的区别
我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++, 或者说编译用gcc,链 接用g++,一时也不知哪个说法正确,如果再遇上个ex ...
- 转:在CentOS下编译安装GCC
转:https://teddysun.com/432.html 在CentOS下编译安装GCC 技术 秋水逸冰 发布于: 2015-09-02 更新于: 2015-09-02 6519 次围观 ...
- CentOS6.5升级手动安装GCC4.8.2 与 CentOS 6.4 编译安装 gcc 4.8.1
http://blog.163.com/zhu329599788@126/blog/static/6669335020161179259975 http://www.cnblogs.com/codem ...
- 编译安装 gcc 4.9并验证使用
编译安装 gcc 4.9并验证使用 1. 准备环境(GCC 编译器) centOS 6.3 cat /proc/version Linux version 2.6.32-279.el6.x86_64 ...
随机推荐
- java.util.ConcurrentModificationException解决详解
异常产生 当我们迭代一个ArrayList或者HashMap时,如果尝试对集合做一些修改操作(例如删除元素),可能会抛出java.util.ConcurrentModificationExceptio ...
- Android之2次打开添加友盟统计代码,后缀会添加广告
这里首先列明步骤, 做一个标识仅此而已. 1. 首先使用apktool来反编译你待需要加入友盟统计的apk包, 具体如何使用与配置apktool, 请参考我关于apktool配置的文章. 2. 然后自 ...
- Android使用代码模拟HOME键的功能
Intent intent= new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.addF ...
- 内核态(Kernel Mode)与用户态(User Mode)
内核态: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序 用户态: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺 ...
- IDEA远程debug的使用
1.打开配置页面 2.添加远程调试配置 3.进行参数配置 不同的jdk版本,配置的参数是不一样的! 其中Host为远程服务器的地址,Port为远程debug的端口,注意要与前面设置的address保持 ...
- @几种OutOfMemory异常
Java虚拟机运行时数据区 在Java虚拟机规范的描述中,除了程序计数器之外,虚拟机内存的其他几个运行时区域都会发生OutOfMemory异常的可能. 我们可以在IDE(如IDEA)中设置虚拟机启动参 ...
- 初识网络进程通信<Heart.X.Raid>
可以这样说:我们在网络上只做一件事,利用各种软件没完没了的相互通信. 对于单机系统而言,进程在系统中有自己唯一的进程号.但在网络环境下,各主机独立分配的进程号不能唯一标识该进程.例如,主机A赋于某进程 ...
- 生成学习算法(Generative Learning algorithms)
一.引言 前面我们谈论到的算法都是在给定\(x\)的情况下直接对\(p(y|x;\theta)\)进行建模.例如,逻辑回归利用\(h_\theta(x)=g(\theta^T x)\)对\(p(y|x ...
- TCP UDP Socket 即时通讯 API 示例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Pycharm安装详细教程
今天小编给大家分享如何在本机上下载和安装Pycharm,具体的教程如下: 1.首先去Pycharm官网,或者直接输入网址:http://www.jetbrains.com/pycharm/downlo ...