linux1.0内核代码学习(四) 之在zboot中符号表的应用

linux1.0以上的内核是压缩过的,在启动的过程中会调用zboot/misc.c中的decompress_kernel函数解压缩,在解压缩的过程中需要得到压缩文件tools/zSystem的文件长度input_len,这是一个外部引用的变量,这个变量的值在哪里定义的,这就需要用到符号表了,是通过zBoot/piggyback.c文件中定义了input_len的符号表,并对这个变量赋值,然后再将这个符号表写入到压缩文件tools/zSystem的尾部,在链接过程中,链接程序通过查找符号表得到这个变量的值,就可以提供给zboot/misc.c文件中的函数使用了。

 

通过几张图来说明这个问题,当然图是手工画的,先明白这个意思,具体的细节可以去看代码。

linux1.0内核代码学习(四) 之在zboot中符号表的应用 - 北极星 - xiebingsuccess的博客

 

linux1.0内核代码学习(四) 之在zboot中符号表的应用 - 北极星 - xiebingsuccess的博客

 

linux1.0内核代码学习(四) 之在zboot中符号表的应用 - 北极星 - xiebingsuccess的博客

 怎么确定链接过程中使用了符号表信息来取得外部变量,可以通过把符号表信息打印出来就可以进一步确定:

zBoot目录中Makefile添加下面一行:

testzboot:

./xtract $(SYSTEM) | gzip -9 | ./piggyback > tmpfile

nm tmpfile | grep -v '\(compiled\)\|\(\.o$$\)\|\( a \)' | \

sort > tmpfile.map

[root@localhost linux_1.0_study]# make -C zBoot/ testzboot

make: Entering directory `/mnt/mywork/linux_1.0_study/zBoot'

./xtract ../tools/zSystem | gzip -9 | ./piggyback > tmpfile

xtract open file is ../tools/zSystem

xtract System is 542756 bytes.

Compressed size 227879.

Output string table 27.

nm tmpfile | grep -v '\(compiled\)\|\(\.o$\)\|\( a \)' | \

sort > tmpfile.map

make: Leaving directory `/mnt/mywork/linux_1.0_study/zBoot'

 

用ue编辑器打开tmpfile.map文件,可以看到如下信息:

00000000 D input_data

00037a27 D input_len

 

大写的D表示符号在已初始化数据区中,是全局的变量,input_len=0x37a27,这样整个过程就联系起来了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值