Linux kernel 确定剥离的Linux内核映像的加载地址和入口点

Linux kernel 确定剥离的Linux内核映像的加载地址和入口点,linux-kernel,embedded-linux,entry-point,symbol-tables,nm,Linux Kernel,Embedded Linux,Entry Point,Symbol Tables,Nm,我在x86 Linux上有一个用于嵌入式系统(mipsel)的交叉编译工具链。我知道如何为它构建自定义内核(让我们称之为映像“vmlinux”),以及如何通过 objcopy -S -O binary vmlinux vmlinux.bin 为了进一步处理,我还需要加载地址和图像的入口点在剥离之前,通过脚本/mksysmap或更明确地说,通过 nm -n vmlinux | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > System

我在x86 Linux上有一个用于嵌入式系统(mipsel)的交叉编译工具链。我知道如何为它构建自定义内核(让我们称之为映像“vmlinux”),以及如何通过

objcopy -S -O binary vmlinux vmlinux.bin
为了进一步处理,我还需要加载地址和图像的入口点在剥离之前,通过
脚本/mksysmap
或更明确地说,通过

nm -n vmlinux | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > System.map
然后我可以通过

awk '/A _text/ { print "0x"$1; }' < _System.map
awk '/T kernel_entry/ { print "0x"$1; }' < System.map

objcopy可用于通过使用二进制的输出目标生成原始二进制文件(例如,使用-O binary)。当objcopy生成一个原始二进制文件时,它实际上会生成输入对象文件内容的内存转储。所有符号和重新定位信息都将被丢弃。内存转储将从复制到输出文件的最低部分的虚拟地址开始

以下是一个可用于PowerPC体系结构的示例:

原始vmlinux

bash-3.2$ file vmlinux
vmlinux: ELF 32-bit MSB executable, PowerPC or cisco 4500, version 1 (SYSV), statically linked, not stripped
剥离的vmlinux被视为一个“数据”文件

bash-3.2$ file vmlinux.bin
vmlinux.bin: data
bash-3.2$ file vmlinux.bin.x
vmlinux.bin.x: ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped
将PowerPC的二进制文件转换为ELF格式

bash-3.2$ powerpc-440fp-linux-objcopy -I binary vmlinux.bin -B powerpc -O elf32-powerpc vmlinux.bin.x
vmlinux的输出现在被视为ELF文件

bash-3.2$ file vmlinux.bin
vmlinux.bin: data
bash-3.2$ file vmlinux.bin.x
vmlinux.bin.x: ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped
您必须传递-I-B-O参数。您可以从objcopy文档中获取此参数


但是,由于二进制文件已被剥离,因此可能不值得进行反编译,因为节信息不可用。文件中的所有数据都将转储到.data secion中。

迟来的感谢您的回答。很遗憾,我没有通过电子邮件得到关于答案的通知,对不起。事实上,我设法找到了另一种方法来找出加载地址和入口点,但我的解决方案是针对具体情况的,不能普遍应用,因此我在这里不引用它。我只想说,您提出的解决方案确实创建了一个ELF文件,但该文件不包含所需的重新定位信息。因此,无法通过
nm-n
从中提取信息。谢谢你的回答。