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

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

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

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台#Z*[Mj$\wA3y

1 sysroot方式交叉编译目标系统

N9x%|g6X+[;[xvO0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台,Tm!~0Tm$G


6eAAf1q0

sysroot方式交叉编译目标系统

       在交叉编译过程中无法使用切换运行环境的方式,因为目标系统不能在当前系统中运行。采用的制作方式是将目标系统存放在当前系统的某个目录,编译链接在该目录下。 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台,Zx-v ]1X }8ClDJ7X9D

       程序链接时候需要指定链接函数库的路径,默认情况下链接时的路径与程序运行时的路径是一致的,当程序运行是不能在原路径下找到链接函数库文件就会导致程序无法运行。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台2?QyO}Q4k.Eg

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

6M!o;yU%FA0

1、目标系统制作和运行之间的矛盾

tEv3Sc.CM k8el0

在制作本地linux的时候,gcc默认在/usr/include 下查找头文件,binutils在/libs,/usr/lib,LD_LIBRARY_PATH,/etc/ld.so.conf目录中查找共享库。在交叉编译中不能直接为目标系统链接/lib等,因为这些都是主系统的函数库。

#c&iA]@m,l0

制作目标系统和运行目标系统之间的矛盾在于一个路径,该路径在制作过程中需要而在运行的时候不需要,该路径在主系统中用于存放目标系统。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 CbP8C-j$C N

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

Z|!rb KO7y OS0

 

(y;g W}1r [5h D0

2、临时系统解决方案

h,Q'X.K(E'd0

根目录的矛盾在本地系统制作过程中使用临时系统作为过度系统,这样在制作目标系统时候不是由主系统而是临时系统来制作的,临时系统不占用主系统的根目录。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台i|?y A$Dl3MrV

通过做一个能自我编译的临时环境,使其中的命令链接到/tools/lib目录中的函数库,这样避免了和主系统的冲突。然后调整gcc和binutils链接到/tools/lib下。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台g`*b-U7VuJ X

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

gzQ`9i|0

临时系统方案,最关键的就是切换临时系统,但是切换的基础是临时系统必须可以在本地平台运行。交叉编译的临时系统是不能在本地系统运行的,所以不能采用这个办法。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台.qH/F5[?

 

9w)f*z,o4z4s [0

3、sysroot方案

/VYiWz0R0

简单理解:编译和链接的默认路径都是${sysroot}/usr,${sysroot}/lib,${sysroot}/usr/include等,默认情况下${sysroot}/是空,如果指定了sysroot=/cross 编译的时候就会去指定目录下查找。

5J i4LE,Ce0

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

;Pu ]^!g:}0

sysroot解决了制作和运行时候的矛盾,制作目标系统时候不需要临时系统来过度,直接利用主系统的命令工具来制作目标系统的辅助命令,形成了交叉编译环境。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台7S$X5UMe:D

在sysroot解决方案中,sysroot概念只存在于制作目标系统的相关软件包中,如gcc,binutils,shadow这样的包,这些软件包运行在主系统中,完成整个目标系统的制作后不再参与目标系统的运行。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台9L&u5K9_&f7z

目标系统中包括binutils和gcc在内的各种软件包都是由交叉编译环境完成的,在整个过程中不会参与制作,因此不需要sysroot的支持。他们是sysroot处理的对象。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台%j%WU\#[-s

 

`*K)@7z z.Q6~0

4、sysroot的使用

2m7Y7R9D1iFcM{0

sysroot仅在binutils,gcc以及一些特殊的工具命令中使用。

z Z \O7t:uN0

a、ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台]u$zM2dRC[

binutils和gcc由官方支持的。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台9o^5I%A-cUr

gcc中的Makefile.in文件中有:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 unc[pI;~/c n4^dN2d

NATIVE_SYSTEM_HEADER_DIR=/usr/include

WIP\ D l"r'tJE0

CROSS_SYSTEM_HEADER_DIR=@CROSS_SYSTEM_HEADER_DIR@ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台.Y3{8YAjG

其中CROSS_SYSTEM_HEADER_DIR表示了交叉编译过程中如何查找头文件。该变量在configure中:ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台q[5G1H%N

CROSS_SYSTEM_HEADER_DIR='$(TARGET_SYSTEM_ROOT)$(NATIVE_SYSTEM_HEADER_DIR)'

0t1O5h)hN(@x&o0

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

u3Y%f%s@a9X0

TARGET_SYSTEM_ROOT=$with_sysroot

W k aaZXtrS ~6u0

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

UP k(aC?R_i0

由此可知交叉编译默认支持--with-sysroot ,本地编译不支持。ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台 @B(~ SY,h

 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台7M`0k:]t ~7m~

b、ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台0c!i;G1j ?:X,Y*M&Vf

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

0V0n4pA8?G4Y+S0

 

B7l_%P3yzB0

5、sysroot和其他目录参数的关系

!WK;Ih!?C_0

与sysroot有关的还有prefix,sysconfdir等设置。prefix和sysconfdir这些参数通常设置的目录之间影哟功能到生成的代码中。sysroot仅仅在编译和链接的时候使用。当使用sysroot方式来制作目标系统的时候,各个软件包不需要考虑目标系统在制作过程中所存放的目录,编译和链接时候会自动按照sysroot设置的目录进行处理。

4Z4T mb/|0

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

rLkg OM0

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

6ODiBy9s0

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

#FRO.IO(v(r2`^MEM0

通常软件包安装命令:

#l8cxQ5{vE oZ0

make installET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台&a [,\ mk|

使用DESTDIR:

}5Y\ Y5A Cx P|-e0

make DESTDIR=/cross install

8I L"T&@i[C0

会安装到/cross/usr目录下。

[%k.dZhI0

m%z/N@)BZ0


2

dY2H9M1L q:J Xf H*c0

X O1g$y9c(j0 

!Z,YZo h V)qP0

#|;u:b2J+fN0 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台L!Z1w-B["qVu C

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台zS2I9W0PI/w O~

 

1U$K,l[.Ek$t0V0

-N+De#tGE(dv(a4B0 

"j-{_5^0F9o4V0

"L PQ?Q9Q0


ref:

%lk8wLJNe0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台Y9d7F U3J w,^

http://hi.baidu.com/ycsunjane/item/5af5523171906180c2cf29a3ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台QVrL:B5q

ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台^8XuC.BU

http://www.idcrx.com/zhishiku/linux/2012/0601/158979.htmlET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台([!FK9^s6t

WT'|lu6n5?],v0 

;Y,Lm/O4N.QQe @s0ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台`*DItoJ1Yl{-Sx

 ET创芯网(EETOP)-电子设计论坛、博客、超人气的电子工程师资料分享平台7n)qiZ9b V3_(i%~%C


TAG: 目标 系统

 

评分:0

我来说两句

显示全部

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

Open Toolbar