??xml version="1.0" encoding="utf-8" standalone="yes"?>
LFS/CLFS工具链是一套用于从C/C++源代码生成可执行文g的Y件组仉当地组合在一起Ş成的pȝ。它包括4大部分,~Z不可Q?/span>
1、一套头文gQ包含了q些源代码所需要访问的pȝ接口?/span>
2、binutilsQ包含一些处理二q制可执行文件所需的工P如汇~器、连接器{等?/span>
3、gccQ包含了~译C/C++源代码所需的工Pq且q能自动调用相关的binutils工具来完成生成源代码的工?/span>
4、glibcQ包含了pȝ接口的具体实现?/span>
在上面的定义中,h意这些Y件必适当地组合,才能形成完整的工具链。那么怎么才算适当l合呢?当然Q这个工具链必须能够发挥作用Q也是实能够~译出目标代码,然后才能适当l合?/span>
那么Q一个适当l合的工具链应当h什么特点呢Q一般我们把工具链运行的机器UCؓhostQ所产生的代码称为target。那么对于工具链的要求便是:它必要能在host上运行,所产生的代码必能在target上运行。再q一步分析:
1、头文gQ必L针对target的,因ؓ使用q个工具铄译的源代码需要访问的pȝ接口是trget上的?/span>
2、binutilsQ必能在host上运行,然而生target的代码?/span>
3、gccQ和binutils一栗不q这里要注意的是Qgcc自n带有一个库Q称为libgccQ它必须是target上的代码?/span>
4、glibcQ必Ltarget上的代码?/span>
有了q些基本认识Q让我们来看一看一些实际的工具链构造过E?/span>
LFS工具链构造顺序:binutils p1->gcc p1->头文?>glibc->adjust->gcc p2->binutils p2
其中最后两步应该可以互换,但头两步不行。如果你有留意编译过E,会发玎ͼ当gcc~译的时候,一旦内部编译第一ơgcc完成Q生了xgcc文gQ随后的~译׃利用新编译的gcc以及W一遍的binutilsQ而不是宿ȝgcc和binutils?/span>
正如youbest指出的,W一遍的binutils和gcc存在的意义,仅仅是ؓ了能~译出glibc。而glibc的编译需要工具链所有其它内容,包括binutils,gcc和头文g?/span>
LFS不用交叉编译,因此host和target永远是一L。在~译参数中,我们永远看不?-host?-target的n影。但是,׃工具铄引用路径需要反复变化,因此我们需要通过修改specs来更攏V这ҎLFS比较Ҏ出错的地斏V?/span>
CLFS思义Q是要采用交叉编译的。其构造顺序如下:
头文?>cross binutils->cross-gcc c->glibc->gcc final (c/c++)
我们首先看到头文件被攑֜了开头。这不是必须的,它完全可以放在glibc之前。cross-gcc只能~译出C~译器,因ؓq时候工具链q不全,glibcq不存在Q不可能~译出C++~译器。然后构建glibc。之后,我们才能~译出C++~译器,完成我们的工具链?/span>
CLFS-SYSROOT的工具链E有不同Q顺序如下:
头文?>cross-binutils->glibc头文?>cross-gcc c->gibc->gcc-final (c/c++)
我们看到q里多了一个glibc头文件的安装。事实上Q这是由于这里编译的gcc是要用sysroot的缘故。在gcc/configure里面有一D代 码,大家在vi里面输入/inhibit_libc=false可以发玎ͼ在交叉编译,而没有SYSROOT的情况下Qinhibit_libc的g 成ؓtrueQ而要是sysroot了,false了?/span>
q个变量的作用,如同有关的注释所qͼ是用来关闭gcc对glibc头文件的依赖。因此,在sysroot下我们才会需要这样一个安装glibc头文件的步骤?/span>
我想在sysroot下消除这个步骤,之前试q这个补丁可行:
使用q个sed命o打个补丁卛_Q?/span>
cp gcc/configure{,.orig}
sed -e 's/inhibit_libc=false/inhibit_libc=true/g' gcc/configure.orig > gcc/configure
不过最q发现有更简单的ҎQ在configure的时候加个参?-with-newlib卛_。徏议采用这个方法,因ؓ不需要打M补丁?/span>
在此再说一句,工具链构E中Q编译脚本对于是否交叉编译的判断非常单,只要host!=targetQ就会被认ؓ正在交叉~译。这也就是ؓ什? CLFS中用的$CLFS_HOST通常都是i686-cross-linux-gnuq样的Ş式。原因很单,因ؓ要确?CLFS_HOST ?CLFS_TARGET不同。这P你完全可以在i686?交叉~译"i686的代码?/span>
q点非常重要Q这意味着我们不需要打M补丁Q即可利用CLFS和CLFS-SYSROOT代替LFS来完成系l。对于想做Multilib的朋友,q也是一个福韟뀂毕竟,CLFS-SYSROOT比vCLFS和LFS来,节省了大量的~译q程?/span>
最后,我们来理解一下如何作CCLFS工具链。这意味着我们要在一个^C构徏在第二个q_上运行、生成第三个q_上代码的工具链。我们用build表示 构徏工具铄机器Qhost表示工具链要q行的机器,target表示工具铄成的代码所在机器。而在工具铄件上Qhost-target binutils表示该binutils在host上运行,要生成target的代码?/span>
步骤如下Q?/span>
host 头文?>build-host binutils->build-host gcc c->host glibc->target 头文?>build-target binutils->build-target gcc c->target glibc->host-target binutils->host-target gcc final (c/c++)
注意事项如下。首先,头文件必d相应的glibc之前安装。其ơ,build-target的binutils和gcc在这里的目的是生成target glibc。而build-host binutils q会被构建host-target binutils和gcc的过E用到。最后,前两ơ的gcc都可以只生成c~译器,因ؓ他们的目的都只是生成glibc。只有最后一ơgcc需要完整生成?/span>
from: http://www.linuxsir.org/bbs/thread325648.html
GNU binutils 是一个二q制工具包,主要包括Q?/p>
ld-GNU的连接器
as-GNU汇编?/p>
除此之外q包括以下工P
addr2line -地址转化为文件名和行?br>ar -创徏、修攏V解压归档文?br>c++filt - C++ 关键词过滤器
gprof - 昄M信息
nlmconv - 目标代码{换ؓNLM
nm - 列出目标文g的标?br>objcopy - 复制和翻译(~译器翻译)目标文g
objdump - 昄目标文g信息
ranlib - 创徏归文g索引
readelf - 昄ELF 格式目标文g的烦?br>size -列出目标文g或者归文件的D长
strings -列出文g中的可打印字W串
strip - 删除标记
windres - Windows 源文件的~译?/p>
q中间的大部分程序都使用Binary File Descriptor library来进行底层处理。很多程序还要用?opcodes library 来进行机器指令的汇编
和Wintel一Pbinutils也被引入C各种各样的UNIXpȝ中,它的引入使得GNUpȝ能够更方便的~译和连接程序?br>