system.map和vmlinux.o中的内存地址(构建Linux内核后),它们是否一一对应?

Memory addresses in the system.map and vmlinux.o (after building Linux kernel), Do they correspond to each other?

system.map和vmlinux.o中的内存地址是否对应? 例如,这是 system.map 文件

的一部分
c03011ec T handle_fiq_as_nmi
c0301270 T do_IPI
c0301274 T do_DataAbort
c0301328 T do_PrefetchAbort

这里是 vmlinux.o 的反汇编文件的一部分。

000001ec <handle_fiq_as_nmi>:
 1ec:   e92d4038    push    {r3, r4, r5, lr}
 1f0:   e3004000    movw    r4, #0
 1f4:   ee1d3f90    mrc 15, 0, r3, cr13, cr0, {4}
 1f8:   e3404000    movt    r4, #0
 1fc:   e7935004    ldr r5, [r3, r4]

为什么 handle_fiq_as_nmi 有两个不同的地址?

vmlinux.o 是一个 可重定位的 文件,而不是 可执行的 文件。

file vmlinux.o看其类型,还是更详细readelf -h vmlinux.o

需要将可重定位文件链接在一起以生成最终的可执行文件(如 a.out,对于您的情况是 vmlinux)。

可重定位文件中的地址不是最终地址,它们将在链接时重定位。参见 linking, ELF formatSystem.map中的地址是最后一个。