免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5102 | 回复: 8
打印 上一主题 下一主题

bootloader连接文件。。问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-01-03 15:10 |只看该作者 |倒序浏览
5可用积分
交谈中请勿轻信汇款、中奖消息,勿轻易拨打陌生电话。

请教大侠帮忙

这是一个uboot的连接文件,
/*u-boot.lds*/
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;//能否解释一下 “.=”“.”是什么意思?
. = ALIGN(4);
.text      :
{
   cpu/arm920t/start.o (.text)
   *(.text)
}
            //另外,也不知道下面这几句代码的具体作用,只是知道是代码。
. = ALIGN(4);
.rodata : { *(.rodata) }
. = ALIGN(4);
.data : { *(.data) }
. = ALIGN(4);
.got : { *(.got) }
. = .;                       //这一句这样写是什么意思?天书啊。。
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}

问题如下:
上述文件指定bootloader连接的入口点(_start),同时又定bootloader在flash中的地址为0x0。对吧?指定bootloader在flash中的地址0x0,是不是多此一举呢?因为即使不指定的话,bootloader编译好后,烧写的时候也可以吧bootloader烧写到到flash中的地址0x0处。

这种奇怪的语法格式,各位大侠能不能解释一下。。很多的“点”不知道什么意思。。。什么作用。。

谢谢。

最佳答案

查看完整内容

我想明白了,这应该类似于宏,而不是变量代码中出现N个__u_boot_cmd_start,遍好的文件中会为分配N个存储空间,并对应着N个Elf32_Rel重定位项. 连接器还会分配一个Elf32_Sym,指明__u_boot_cmd_start的值,最后连接或者动态连接时,更新N个Elf32_Rel重定位项,既更新了N个存储空间.虽然确实有分配空间,但是却不是变量, __u_boot_cmd_start对应的全部都是重定位项,显然不能&__u_boot_cmd_start.说宏也有些勉强,因为编译成位置无关的话,,在 ...

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
2 [报告]
发表于 2008-01-03 15:10 |只看该作者
我想明白了,这应该类似于宏,而不是变量

代码中出现N个__u_boot_cmd_start,遍好的文件中会为分配N个存储空间,并对应着N个Elf32_Rel重定位项.

连接器还会分配一个Elf32_Sym,指明__u_boot_cmd_start的值,

最后连接或者动态连接时,更新N个Elf32_Rel重定位项,既更新了N个存储空间.

虽然确实有分配空间,但是却不是变量, __u_boot_cmd_start对应的全部都是重定位项,显然不能&__u_boot_cmd_start.

说宏也有些勉强,因为编译成位置无关的话,,在加载时,ld.so会根据装载地址,而修正__u_boot_cmd_start的值对应的这N个存储空间.

[ 本帖最后由 塑料袋 于 2008-1-3 20:17 编辑 ]

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
3 [报告]
发表于 2008-01-03 17:46 |只看该作者
. = 0x00000000;  /* 当前地址为0x00000000,以计算后边代码中,所有绝对寻址的指令*/
.text 节                       /* 含start.o 文件的.text节,及其他所有obj的.text节*/
. = ALIGN(4);                          /* 按4byte对齐*/
.rodata节                     /* 含所有obj的.rodata节*/
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
. - .                                         /* 这是什么意思???????*/
__u_boot_cmd_start = .        /* 相当于程序中定义了宏,__u_boot_cmd_start = u_b
                                                  oot_cmd节的起地址*/
u_boot_cmd节                /*所有obj的u_boot_cmd节*/

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
4 [报告]
发表于 2008-01-03 18:00 |只看该作者
一旦仔细想,到处都是问题

1) . = . 什么意思?

2) __u_boot_cmd_start什么意思?是一个宏还是一个变量?
如果是变量,且编译成位置无关代码,会不会对应所有使用__u_boot_cmd_start的地方,增加Elf32_Rel的重定位项,依照R_386_RETALIVE来重定位?

论坛徽章:
0
5 [报告]
发表于 2008-01-03 19:21 |只看该作者
查了一下文档,下面是它出现的
. = . + 0x1000; /* move to a new page in memory */

默认开始的绝对地址就是0,所以
. = 0;
. = .;
看起来貌似是多余的,不过既然是在代码中,估计就有用了
会不会是.=.会蕴含着对齐什么的
__u_boot_cmd_start这样的东西对.c来说,肯定不是宏了,因为它的就是个未解析的符号,内核很多地方也这么做,比如
static inline int is_kernel_text(unsigned long addr)
{
        if (addr >= PAGE_OFFSET && addr <= (unsigned long)__init_end)
                return 1;
        return 0;
}
__init_end对其它.o就是个外部定义的变量,连接的时候才能知道,连接器知道它等于什么...(因为它已经安排好了相对起始地址的空间了)

位置无关代码不了解,不过怎么连接就像在库的.c中extern声明了一样吧

论坛徽章:
0
6 [报告]
发表于 2008-01-04 11:15 |只看该作者
非常感谢两位大侠的热情帮助。
一直非常敬佩flw2大侠,感谢。您能为这点小事查阅资料,小弟很感激。。第一次送分,本来想吧分数平均送给两位大侠。可是发现不能分。
由于塑料袋大侠发了3个帖子。。所以分数给他了。。哈哈。。。

另外还有个问题各位是不是清除?
问题如下:
上述文件指定bootloader连接的入口点(_start),同时又定bootloader在flash中的地址为0x0。对吧?指定bootloader在flash中的地址0x0,是不是多此一举呢?因为即使不指定的话,bootloader编译好后,烧写的时候也可以吧bootloader烧写到到flash中的地址0x0处。

再,另外个问题:
text,rodata,got,bss段,其中got段是什么作用?

__u_boot_cmd_start
__u_boot_cmd_end
__bss_start
都是最后生成文件的不通部的分标号吧。

论坛徽章:
4
戌狗
日期:2013-08-15 18:22:43技术图书徽章
日期:2013-08-21 13:48:45巨蟹座
日期:2013-09-26 17:06:39处女座
日期:2013-12-25 11:26:10
7 [报告]
发表于 2008-01-04 13:22 |只看该作者
你都把分给我了,不帮到底也说不过去。

你烧写可以烧到任何地址,但是只有在你烧写到的地址与
ENTRY(_start)
SECTIONS
{
. = 0x00000000;           /  * 与这个地址一致时,程序才会正常工作* /
. = ALIGN(4);
.text      :
{
   cpu/arm920t/start.o (.text)
   *(.text)
}

因为text段中有很多绝对寻址的指令,在链接时,必须计算出这些绝对寻址指令寻的是哪个地址。绝对地址=文件装载地址+偏移地址。

偏移地址连接器会自己计算,文件装载地址通过上边那句指定。


got段是ELF文件的特殊要求。用于在连接,动态连接时,修正各符号的值。
文件装载地址不确定,或者链接不完全的文件,如OBJ,使用动态库的EXECUTE,或者Shared library,这些必须有got段。其他文件可有可无。

论坛徽章:
0
8 [报告]
发表于 2010-09-05 14:12 |只看该作者
路过 学习 长知识!!!!

论坛徽章:
0
9 [报告]
发表于 2010-09-05 15:08 |只看该作者
同样学习!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP