这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 关于内核编译时的联接及system.map的问题

共1条 1/1 1 跳转至

关于内核编译时的联接及system.map的问题

菜鸟
2004-11-18 18:58:53     打赏
关于内核编译时的联接及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 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]