我有一个用于x86 Linux上嵌入式系统(mipsel)的交叉编译工具链。我知道如何为它构建一个自定义内核(让我们将映像称为"vmlinux"),以及如何通过剥离该映像
objcopy -S -O binary vmlinux vmlinux.bin
为了进一步处理,我还需要加载地址和图像的入口点剥离前通过scripts/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被剥夺了符号。有人能告诉我怎么做吗?我对内核构建和工具链的使用不是很熟练。nm和objdump都不喜欢剥离的图像,称
vmlinux.bin: File format not recognized
从objcopy手册页面
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
将二进制转换为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.x
vmlinux.bin.x: ELF 32-bit MSB relocatable, PowerPC or cisco 4500, version 1 (SYSV), not stripped
您必须通过-I、-B和-O参数。您可以从objcopy文档中获取这些参数。
但是,由于您的二进制文件已经被剥离,并且正在尝试反编译,因此可能不值得,因为节信息不可用。文件中的所有数据都将转储到.data secion中。