历史上的今天
今天是:2025年04月15日(星期二)
2018年04月15日 | TQ2440之uboot---4.分析u-boot Makefile 最后连接的过程
2018-04-15
1.最后生成u-boot的过程
以下是u-boot Makefile最后连接生成u-boot的过程
UNDEF_SYM=`arm-linux-objdump -x lib_generic/libgeneric.a board/EmbedSky/libEmbedSky.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/jffs2/libjffs2.a net/libnet.a rtc/librtc.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/lcd/liblcd.a modules/usb.module modules/wince.module common/libcommon.a |sed -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd /root/embed/opt/EmbedSky/u-boot-1.1.6 && arm-linux-ld -Bstatic -T /root/embed/opt/EmbedSky/u-boot-1.1.6/board/EmbedSky/u-boot.lds -Ttext 0x33D80000 $UNDEF_SYM cpu/arm920t/start.o \
--start-group lib_generic/libgeneric.a board/EmbedSky/libEmbedSky.a cpu/arm920t/libarm920t.a cpu/arm920t/s3c24x0/libs3c24x0.a lib_arm/libarm.a fs/cramfs/libcramfs.a fs/jffs2/libjffs2.a net/libnet.a rtc/librtc.a drivers/libdrivers.a drivers/nand/libnand.a drivers/nand_legacy/libnand_legacy.a drivers/lcd/liblcd.a modules/usb.module modules/wince.module common/libcommon.a --end-group -L /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/lib/gcc/arm-linux/3.4.5 -lgcc \
-Map u-boot.map -o u-boot
a. UNDEF_SYM的作用
用objdump -x 列出所有库的头
用sed 将 __u_boot_cmd_.* 替换成 -u__u_boot_cmd_.*
sort| uniq 去掉重复的部分
所以执行后 UNDEF_SYM=
-u__u_boot_cmd_autoscr
…...
-u__u_boot_cmd_test_zImage
-u__u_boot_cmd_tftpboot
-u__u_boot_cmd_usbslave
b. arm-linux-ld -Tu-boot.lds -Ttext 0x33D80000
u-boot.lds 中有如下:
. = 0x00000000;
. = ALIGN(4);
.text :
{
cpu/arm920t/start.o (.text)
board/EmbedSky/boot_init.o (.text)
*(.text)
}
b.1虽然 u-boot.lds 是从0x00000000 开始,但是这儿明确的指定了 -Ttext 0x33D80000, 所以生成的u-boot的代码段是从0x33D80000开始的。
b.2 另外 UNDEF_SYM中的一系列的 -u__u_boot_cmd_.*提供给ld
但是还有一点不太明白的就是,为什么要这样做?
参考了这篇文章,对crifan的崇拜有如滔滔江水......
http://www.crifan.com/2010/02/27/detailed_analysis_of_the_make_uboot_final_compile_and_link_the_implementation_process/
以下引自crifan的《详细分析make uboot 最后的编译链接的具体执行过程 v2012-03-29》
“-u symname
——————————
Enter symname as an undefined symbol in the symbol table. This is useful for loading entirely from an archive library, since initially the symbol table is empty, and an unresolved reference is needed to force the loading of the first routine. The placement of this option on the command line is significant; it must be placed before the library that will define the symbol.
—————————————————————————————————————-
总的意思,就是,在ld的时候,不定义,这些符号,即不定义__u_boot_cmd_asdebug,__u_boot_cmd_base等等这些符号,我的理解是,因为开始需要从某个库中载入其他的符号,而这个时候,还没有载入到那个包含此符号定义的库,所以,暂时先加入这个-u说明,先不定义这些符号,等到所有的库都加载完了,再去找这些符号的定义,此时已经加载完所有的库了,也就能找到这些符号的定义了。
(F)接下来的,就是要ld的,那一堆的目标文件,库文件了:
cpu/arm926ejs/start.o和
–start-group lib_generic/libgeneric.a lib_generic/lzma/liblzma.a cpu/arm926ejs/libarm926ejs.a 。。。。。。 post/libpost.a board/ams/as3536/libas3536.a –end-group
关于–start-group和 –end-group的含义:
-(archives)或者—start-group archives –end-group 参数中间的目标文件会被ld反复搜索,对相互交叉引用的目标文件很有用
所以,我的理解是,如果ld载入了一个库,发现该库中,有UNDF,未被定义的变量,有了这个参数的指示后,就会在这一堆.a和.o文件里面反复搜索,直至找到为止,否则,如果在已经加载的库中,找不到,就会报错。”
关于”–start-group和 –end-group”,又去找了相关资料:
Linker order – GCC
GCC: –start-group and –end-group command line options
得知确切的含义是:
链接器LD去load对应的库(lib,module)的时候,可能会遇到这些情况:
(1)A库,引用了B库中funcInB(),但是先ld A库,导致找不到对应的funInB而链接报错
(2)A库和B库,互相都包含对应所引用到的函数,即互相引用/循环引用,ld编译器会因为找不到A库中所引用的B库的中的函数(或者反过来B库引用A库中的函数)而报错。
此时,用”–start-group和 –end-group“,通知ld链接器,去在–start-group和–end-group中间的这些库函数,多花点时间,对于这些库,都从头到尾,多查几遍,去找找那些还没有找到的所引用的函数,是不是在另外的库中有这些函数,以此解决:
(1)A库引用到了后来才加载的B库中的函数
(2)解决循环引用
之类的问题。
史海拾趣
|
测试测量的第一个主题活动,入门篇,测试测试工具大搜索。也欢迎大家说说自己的使用心得。 测试测量必备工具一:万用表 测试测量必备工具二:示波器 测试测量必备工具三:信号发生器 测试测量必备工具四:频谱仪… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 一、引言 无线网络,顾名思义是利用无线电波而非线缆来实现与计算机设备位置无关的网络数据传输系统,是现代数据通信系统发展的一个重要方向。随着计算机网络技术、无线技术以及智能传感器技 ...… 查看全部问答> |
|
在mcu中,我想在一个c文件中用同样的宏,却在每个函数中实现不同的功能。。 各位高手,,有没有什么办法实现呀。。 例:#define setSDA P1|=(1… 查看全部问答> |
|
刚刚入门 所以我在运行程序时出现错误如下: D:\\森汉机器人光盘备份\\程序\\6S-C语言\\basal.c(2): Could not find include file C:\\icc\\bin\\imakew -f test.mak C:\\icc\\bin\\imakew.exe: Couldn\'t open D:/icc/include/macros.h GetLa ...… 查看全部问答> |
|
知名外资通讯企业招聘软件开发工程师,协议工程师,算法分析和实现工程师及算法分析系统仿真工程师!!! 无线产品软件开发工程师 职责描述: 负责无线产品软件模块的设计、编码、调试、单元测试等工作,参与相关质量活动,确保设计及实现工作按时保质完成。 职位要求: 1. 本科以上学历,计算机软件、通信、电子、数学、物理及相关专业,有扎实的 ...… 查看全部问答> |
|
榕盛文化公司(rssdbook.)致力于图书的选题策划、编辑加工和出版,由具有大型出版社工作背景、从事图书出版10余年的资深编辑组建。公司以“弘扬优秀文化、传播卓越品质”为出版理念,成立以来已有数十本图书在全国出版,其中畅销书多达30本,有10 ...… 查看全部问答> |




