关于内核的启动地址0x30008000与连接脚本vmlinux.lds

langwangrenzhengfei 2009-05-07 03:38:04
S3C2440下内核在RAM中的启动地址是0x30008000,
可是为什么我发现连接脚本kernel-2.6.13\arch\arm\boot\compressed\vmlinux.lds中设置的起始地址并不是0x30008000,而是0,具体内容如下:
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
. = 0;
_text = .;

.text : {
......
.....
}
......
......
}

请问按照脚本指定的地址0,生成的代码,怎么能在0x30008000这个位置正确运行呢?
...全文
449 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
morris88 2009-05-07
  • 打赏
  • 举报
回复
貌似那个指定的是 LMA,而非 VMA,编译后用 objdump -h,将结果贴上来瞧瞧 ...
# objdump -h vmlinux
  • 打赏
  • 举报
回复
正确的答案是:PIC!位置无关代码! 多谢几位老大了 !以后还请多关照!
充电宝111 2009-05-07
  • 打赏
  • 举报
回复
看你生成的符号表,是不是从0开始的?那个才是真正的镜像文件,别光看连接脚本,不定什么时候被连接器改了呢
morris88 2009-05-07
  • 打赏
  • 举报
回复
--defsym zreladdr=0x30008000 --defsym params_phys=0x30000100 


这两个参数在你版本里面指定给谁用?
  • 打赏
  • 举报
回复

我在网上看了很多文章,上面讲的vmlinux.lds中都是把连接地址设置成了0x30008000,唯独我手头这个linux-2.6.13按照开发板带的原装配置生成的vmlinux.lds中链接地址设置的是0,不是0x30008000。

我查看了编译的记录,这个链接脚本是这样用的:
arm-linux-ld -EL --defsym zreladdr=0x30008000 --defsym params_phys=0x30000100 -p --no-undefined -X /usr/local/arm/3.4.1/lib/gcc/arm-linux/3.4.1/libgcc.a -T arch/arm/boot/compressed/vmlinux.lds arch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm/boot/compressed/vmlinux

是不是说arch/arm/boot/compressed/head.o 文件中的代码是位置无关的呢?
网上文章讲的vmlinux.lds中的链接地址是0x30008000,而我的2.6.13中vmlinux.lds的链接地址是0,是不是说,在我的2.6.13中head.o的代码进行了改进,改进成位置无关的了?

以上,多谢!
morris88 2009-05-07
  • 打赏
  • 举报
回复
[root@test0 linux-2.6.29]# objdump -h vmlinux

vmlinux: file format elf32-i386

Sections:
Idx Name Size VMA LMA File off Algn
0 .text.head 00000375 c1000000 01000000 00001000 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .text 003f45b5 c1000380 01000380 00001380 2**7
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .notes 00000024 c13f4938 013f4938 003f5938 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
3 __ex_table 00001208 c13f4960 013f4960 003f5960 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .rodata 00181c23 c13f6000 013f6000 003f7000 2**7


你那个貌似 bootloader 干了一些东西
  • 打赏
  • 举报
回复
老大,LMA和VMA都是0啊.
下面是执行objdump -h arch\arm\boot\compressed\vmlinux的结果:

vmlinux: file format elf32-little

Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00179da0 00000000 00000000 00008000 2**5
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .got 00000060 00179da0 00179da0 00181da0 2**2
CONTENTS, ALLOC, LOAD, DATA
2 .got.plt 0000000c 00179e00 00179e00 00181e00 2**2
CONTENTS, ALLOC, LOAD, DATA
3 .data 00000000 00179e0c 00179e0c 00181e0c 2**0
CONTENTS, ALLOC, LOAD, DATA
4 .bss 00008438 00179e0c 00179e0c 00181e0c 2**2
ALLOC
5 .stack 00001000 00182244 00182244 00181e0c 2**0
CONTENTS
6 .comment 00000012 00000000 00000000 00182e0c 2**0
CONTENTS, READONLY

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧