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

linux-kernel – 确定剥离的Linux内核映像的加载地址和入口点,第1张

概述我在x86 Linux上有一个用于嵌入式系统(mipsel)的交叉编译工具链.我知道如何为它构建一个自定义内核(让我们调用图像“vmlinux”)以及如何通过 objcopy -S -O binary vmlinux vmlinux.bin 为了进一步处理,我还需要图像的加载地址和入口点.在剥离之前,通过scripts / mksysmap或更明确地说,通过via来确定它们是没有问题的 nm -n 我在x86 Linux上有一个用于嵌入式系统(mipsel)的交叉编译工具链.我知道如何为它构建一个自定义内核(让我们调用图像“vmlinux”)以及如何通过

objcopy -S -O binary vmlinux vmlinux.bin

为了进一步处理,我还需要图像的加载地址和入口点.在剥离之前,通过scripts / mksysmap或更明确地说,通过via来确定它们是没有问题的

nm -n vmlinux | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( $[adt]\)' > System.map

然后我可以确定加载地址和入口点

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

现在的挑战是,有时候我不是自己构建内核,而是在通过objcopy删除了它的符号后得到一个预构建的内核.谁能告诉我怎么做?我对内核构建和工具链的使用不是很熟练. nm和objdump都不喜欢剥离的图像

vmlinux.bin: file format not recognized
解决方法 从 objcopy manual page

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

以下是可在PowerPC体系结构上使用的示例:

原来的vmlinux

bash-3.2$file vmlinuxvmlinux: ELF 32-bit MSB executable,PowerPC or cisco 4500,version 1 (SYSV),statically linked,not stripped

剥离的vmlinux被视为“数据”文件

bash-3.2$file vmlinux.binvmlinux.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.xvmlinux.bin.x: ELF 32-bit MSB relocatable,not stripped

您必须传递-I,-B和-O参数.您可以从objcopy文档中获取此参数.

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

总结

以上是内存溢出为你收集整理的linux-kernel – 确定剥离的Linux内核映像的加载地址和入口点全部内容,希望文章能够帮你解决linux-kernel – 确定剥离的Linux内核映像的加载地址和入口点所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/1029425.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存