共1条
1/1 1 跳转至页
关于内核编译时的联接及system.map的问题
关于内核编译时的联接及system.map的问题(贴子较长,真心请教)
首先想问一下system.map是依据什么生成的,按网上的资料和朋友所说是依赖于lds文件生成的(lds文件我不是很清楚,我想大概是给连接器指明如何进行连接的用的),我查了一下linux-2.4.20-8的源码,的确在每个arch/$(processer)/中都有lds文件,比如vmlinux.lds,可是在我看的uClinux中确没有这样一个文件,那么连接器是根据什么进行连接,并生成systdm.map文件呢,是不是在别的地方还有可能说明的连接规则呢?在我看的uClinux源码的根Makefile中有如下一句话:$(NM) $(LINUX) | grep -v '\(compiled\)\|\(\.o$$\)\|\( a \)' | sort > System.map,我想肯定是由它直接生成了system.map。说到底这个问题就是连接器是根据什么进行连接(我没学过编译原理,如果有概念性错误望大家指正)?
第二个问题是system.map的内容说代表什么。下面是我看的armS3C4510的uClinux源码编译后生成的system.map的最初一段。
00000100 T _start
00000100 T _stext
00000110 t loop
00000164 t dummy
00000168 t clear
00000178 t move
0000018c t jump
00000190 t call
000001a4 t poke
000001ac t setenv
000001bc t cmdtable
000001c4 t pokehw
000001cc t wait
000001d8 t command_table
000001dc t reference
000001e0 T get_options
00000284 t profile_setup
000002ac t ramdisk_start_setup
000002d0 t load_ramdisk
000002f8 t prompt_ramdisk
00000320 t ramdisk_size
00000344 t checksetup
0000044c T calibrate_delay
00000594 t parse_root_dev
00000634 t parse_options
000007e0 T cpu_idle
00000804 T start_kernel
000009ec t printf
00000a4c t do_rc
文件中的每一个标号应该是汇编中的标号或C的函数之类,那么前面的地址是什么呢,我不太明白。如果说代表了内核加载到RAM中后的物理地址的话,那么_stext之前似乎太小了,只能放得下一些中断入口(在这个板子中SDRAM的起始地址是0x0000)。而bootloader在上电时会把自已和内核都搬进RAM,bootloader在RAM中一般都是在一开始的,这显然放不下。
如果说标号前面的地址代表的是相对地址,那么bootloader随便把内核放在RAM中的一个地方都行(如下图)。那么还有一问题:通用的bootloader像redboot, blob, uboot等如何能跳转到特定内核的start_kernel处,因为我看到在system.map文件中start_kernel函数中的一些子函数如cpu_idle之类都被定位在start_kernel之前,而且对比了其它一些system.map文件,start_kernel的定位没有特别的规律。
+-------------+--------+----------------------------------------------------+
| bootloader | 空白 | 内 核 |
+-------------+--------+----------------------------------------------------+
我希望我把问题说的够清楚。肯请大家指点,我现在真是一团麻了!
关键词: 关于 内核 编译 联接 system.map 问题
共1条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |