Debugging 符号绝对值

Debugging 符号绝对值,debugging,linux-kernel,symbols,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

我试图理解每次编译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\u control\u code\u size
显示为
A
,我知道
A
表示符号的值是绝对的,但我无法完全解码它的确切含义。值是否表示符号的地址?绝对地址是否意味着每当内核加载到内存中时,这个符号就会出现在这个地址上


如果问题太简单,请原谅

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

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

表达式在链接器脚本中的位置决定它是绝对的还是相对的。出现在输出节定义中的表达式相对于输出节的基。出现在别处的表达式将是绝对表达式

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

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


一个例子是。查看第行“以下示例显示了如何定义两个绝对符号定义。”

这意味着即使在链接后符号值也不会改变。了解更多有关nm UTILITY链接的信息,包括在运行时加载共享库并为其中的符号分配地址,为什么该符号会保留绝对值?我的意思不是说这件事本身,但如果能举个例子就好了