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

标签 linux-kernel embedded-linux entry-point symbol-tables nm

我的 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 manual page

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 部分。

关于linux-kernel - 确定剥离的 Linux 内核镜像的加载地址和入口点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8833376/

相关文章:

javascript - Web 浏览器如何决定从服务器接收的文件的入口点?

linux - 从用户空间创建物理内存以用于 DMA 传输

c - 为什么我的小 C 循环不能正确打印到帧缓冲区,但它的展开版本可以?

embedded-linux - TFTP 错误 : 'File not found'

qt - QBackingStore::endPaint() 在 backingstore 绘制设备上使用事件绘制器调用

python - 如何动态添加和加载入口点?

linux - linux 内核支持多少个 vrf,哪些系统资源限制了 vrf 数量?

linux - 可以屏蔽定时器中断吗?

Linux 堆栈驻留内存在堆栈展开后未回收

python - setuptools 入口点。将可执行文件安装到/usr/sbin