符号的绝对值

时间:2015-03-17 20:09:38

标签: debugging linux-kernel symbols

我试图理解每次编译Linux内核时创建的System.map文件,我试图理解System.map文件中显示的值。

以下是来自它的样本信息

000001d5 A kexec_control_code_size
00400000 A phys_startup_32
c0400000 T _text
c0400000 T startup_32
c04000b4 T start_cpu0
c04000c4 T startup_32_smp
c04000e0 t default_entry
c0400158 t enable_paging
c04001da t is486`

如果您看到第一行,则符号kexec_control_code_size的类型显示为A,我知道A表示符号的值是绝对的,但我不是&#39 ;能够完全解码究竟意味着什么。值是否表示符号的地址?绝对地址是否意味着每次内核加载到内存时此符号都会出现在此地址?

如果问题太基础,请原谅。

2 个答案:

答案 0 :(得分:0)

您可以通过" man nm"检查符号类型。 nm工具显示目标文件中的所有符号。有关在nm nm下可以找到的符号类型的详细信息。可以使用nm工具检查Linux内核模块.ko文件和内核对象文件。您还可以使用objdump和readelf从zImage或uImage或任何内核映像以及内核模块中调查符号。尝试使用手册页进行详细说明。可以计算符号的地址,例如从某个主要点的偏移,例如段开始。符号地址计算的其他方法是地址的绝对值(可能是与地址空间有关的绝对值?)。外部符号应该是绝对的。标记为绝对的符号通过任何链接操作保留相同的地址。

答案 1 :(得分:0)

当链接器计算表达式时,结果是绝对的或相对于某个部分。相对表达式表示为距截面基部的固定偏移量。

链接描述文件中表达式的位置决定了它是绝对的还是相对的。出现在输出节定义中的表达式相对于输出节的基数。在其他地方出现的表达将是绝对的。

如果使用-r选项请求可重定位输出,则设置为相对表达式的符号将是可重定位的。这意味着进一步的链接操作可能会改变符号的值。符号的部分将是相对表达式的一部分。

设置为绝对表达式的符号将通过任何进一步的链接操作保留相同的值。符号将是绝对的,并且不会有任何特定的关联部分。取自manual

一个例子是here。查找“以下示例显示如何定义两个绝对符号定义。”