像我儿子一样永远保持好奇和梦想

[b][z]ARM 交叉编译系统的构建

上一篇 / 下一篇  2013-02-19 17:53:21 / 个人分类:linux

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台$he){6L$e pK-C5~

1 sysroot方式交叉编译目标系统龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台?!@%a2[A'mX

{'T;b;}2r(e3R8f0


龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台%]U"H7I ?v&o?

sysroot方式交叉编译目标系统

       在交叉编译过程中无法使用切换运行环境的方式,因为目标系统不能在当前系统中运行。采用的制作方式是将目标系统存放在当前系统的某个目录,编译链接在该目录下。 

1p"r2y kD-G][t N z0

       程序链接时候需要指定链接函数库的路径,默认情况下链接时的路径与程序运行时的路径是一致的,当程序运行是不能在原路径下找到链接函数库文件就会导致程序无法运行。

1qW'_)U7d5Nl0

       在交叉编译过程中必须使用一个非根目录来存放目标系统,如果采用常规的链接,则目标系统运行时候会因为函数库目录位置发生了变化而无法运行。为了解决该问题,在交叉编译过程中引入了sysroot参数。

r5? Lpyq ~0

1、目标系统制作和运行之间的矛盾龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台s{$~Gr"r`+f

在制作本地linux的时候,gcc默认在/usr/include 下查找头文件,binutils在/libs,/usr/lib,LD_LIBRARY_PATH,/etc/ld.so.conf目录中查找共享库。在交叉编译中不能直接为目标系统链接/lib等,因为这些都是主系统的函数库。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台V%w.oS4y4t+{R

制作目标系统和运行目标系统之间的矛盾在于一个路径,该路径在制作过程中需要而在运行的时候不需要,该路径在主系统中用于存放目标系统。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台:}:d7I.t)K+{W8w.U6b

路径的矛盾主要体现在目标系统和主系统运行时根目录结构相同,不能直接在主系统的根目录中完成制作目标系统,这会导致主系统招到破坏。

1W#f Q#i5{Ys-az0

 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台:hALQ5B1Ot msu

2、临时系统解决方案

6s&` gxy0

根目录的矛盾在本地系统制作过程中使用临时系统作为过度系统,这样在制作目标系统时候不是由主系统而是临时系统来制作的,临时系统不占用主系统的根目录。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台!d#e2KJ c

通过做一个能自我编译的临时环境,使其中的命令链接到/tools/lib目录中的函数库,这样避免了和主系统的冲突。然后调整gcc和binutils链接到/tools/lib下。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台2HG*D ~fQDH

这样编译出来的程序必须从/tools/lib中查找库文件,这样就不符合lsb的规范。因此临时系统是不能作为目标系统的。使用chroot命令切换到临时系统环境中,此时因为临时系统的所有命令都是链接到/tools/lib的,所以就为我们最后目标系统让出了根目录。从而避免了根目录冲突。

OyO(VLY,^0

临时系统方案,最关键的就是切换临时系统,但是切换的基础是临时系统必须可以在本地平台运行。交叉编译的临时系统是不能在本地系统运行的,所以不能采用这个办法。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台x4dz:pz+J ?}

 

j2a)o I wT~.d0

3、sysroot方案龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台^I{L9DXN W

简单理解:编译和链接的默认路径都是${sysroot}/usr,${sysroot}/lib,${sysroot}/usr/include等,默认情况下${sysroot}/是空,如果指定了sysroot=/cross 编译的时候就会去指定目录下查找。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台I_!Gw7NI

sysroot表示的目录不会用于目标系统的实际运行,仅仅在编译和链接的时候使用,因此只要sysroot设置为目标系统的安装目录就可以解决制作和运行时的矛盾。

1FA5hC@0

sysroot解决了制作和运行时候的矛盾,制作目标系统时候不需要临时系统来过度,直接利用主系统的命令工具来制作目标系统的辅助命令,形成了交叉编译环境。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台d ghi9d-{j4X

在sysroot解决方案中,sysroot概念只存在于制作目标系统的相关软件包中,如gcc,binutils,shadow这样的包,这些软件包运行在主系统中,完成整个目标系统的制作后不再参与目标系统的运行。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台!OZ0`Hs;zwP

目标系统中包括binutils和gcc在内的各种软件包都是由交叉编译环境完成的,在整个过程中不会参与制作,因此不需要sysroot的支持。他们是sysroot处理的对象。

7[;`SH2Pv0

 

1BXj7]*^0

4、sysroot的使用

7i2X5Jd@c'P'b?.KF0

sysroot仅在binutils,gcc以及一些特殊的工具命令中使用。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台?A G f&E'\L

a、

QZ`(Q th"}(a0

binutils和gcc由官方支持的。

OG4x"jG z&W0

gcc中的Makefile.in文件中有:

l^X#]4q9d5u0

NATIVE_SYSTEM_HEADER_DIR=/usr/include龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台6m}_m;_%?[d

CROSS_SYSTEM_HEADER_DIR=@CROSS_SYSTEM_HEADER_DIR@龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台Yy` Wy

其中CROSS_SYSTEM_HEADER_DIR表示了交叉编译过程中如何查找头文件。该变量在configure中:

4d@ F%_9A9N4c0

CROSS_SYSTEM_HEADER_DIR='$(TARGET_SYSTEM_ROOT)$(NATIVE_SYSTEM_HEADER_DIR)'龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台_N${*sR LB

其中TARGET_SYSTEM_ROOT在configure中进行了赋值:

_:a*O*t(H M,` t l9J0

TARGET_SYSTEM_ROOT=$with_sysroot

t/gv*Q3i HJ!x0

$with_sysroot通过--with-sysroot参数设置传递给configure。

}h0C+F z"O0

由此可知交叉编译默认支持--with-sysroot ,本地编译不支持。

c6yCm_B|W0

 

m+C_*V$K6VW-X M0

b、

y"gsp*dY,K }0

某些程序也需要处理目标系统中的文件,如shadow设置用户密码,这些工具命令没有提供设置基础目录的方式,也不支持sysroot,无法直接处理目标系统中的相关文件。可以:修改源代码,将默认处理文件的位置前加入目标系统存放路径;或者修改源代码以支持sysroot。

%? V5Z9Pc.JW8F0

 

!wE_] G(k1b0

5、sysroot和其他目录参数的关系龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台)d3U3Y'H?h9J p

与sysroot有关的还有prefix,sysconfdir等设置。prefix和sysconfdir这些参数通常设置的目录之间影哟功能到生成的代码中。sysroot仅仅在编译和链接的时候使用。当使用sysroot方式来制作目标系统的时候,各个软件包不需要考虑目标系统在制作过程中所存放的目录,编译和链接时候会自动按照sysroot设置的目录进行处理。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台aZ;Fa,O

sysroot目录的设置影响最大的是软件包的安装过程,常见的安装过程中,安装程序会使用prefix设置的目录进行安装。使用sysroot设置目录会导致软件包案prefix设置路径进行安装,如/usr,这样的路径会导致软件包安装到主系统中,这又出现了目录冲突的问题

8b`0N\:^0\3H&An0

解决的办法使用一般软件包中自带的DESTDIR参数,该参数设置软件包的安装基础目录。

l$Mwv+n G0

当设置DESTDIR后会在prefix设置的目录下加上该路径。

"`iEUK9J/t)| E0

通常软件包安装命令:

.R}U*M7_X0

make install

aw L)a2`$IV)X `0

使用DESTDIR:龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台,sOi9\(H0Y$p

make DESTDIR=/cross install

%nyz5{H*gk?O*a0

会安装到/cross/usr目录下。龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台9\{9~,?.Nja:m

b8UQi(lT%\Y0


2

7~&k_3Ius+bh)d0

lsoX*U0 

$~S+B&k*V$H'c$j$`2v?0龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台TN+}!jl8gJ$h!I @SaK

 

c N i&G/P*?aG0N%Uc0龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 n2m-Ny"S"aL

 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台)lEQ3Y R'dyb

I~!w&q~$Oe7q!FWi0 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0Nz~w0y2u

'N6ti%Ma[2{{q}0


ref:龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台&L4Cx1t+N'H0[r"u

3@ K|5V v UN0#hi.baidu.com/ycsunjane/item/5af5523171906180c2cf29a3龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台PE%q4lG\c

龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台'T*d0eDm

#www.idcrx.com/zhishiku/linux/2012/0601/158979.html

?E2D2e @H6u`0m0

;GT:Z S'N6Ut_t1n4^(z0 

G6nfV$a2sp0龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台]9U%Cq o

 龙8国际_龙8国际下载_龙8国际娱乐官方网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台8G2?~["Am9ZI


TAG: 目标 系统

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar