【问题标题】:Determine load address and entry point of stripped Linux Kernel image确定剥离的 Linux 内核映像的加载地址和入口点
【发布时间】:2012-01-12 10:17:06
【问题描述】:

我的 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 剥离其符号后获得一个预构建的内核.谁能告诉我该怎么做?我对内核构建和工具链的使用不是很精通。 nmobjdump 都不喜欢剥离的图像,说

vmlinux.bin: File format not recognized

【问题讨论】:

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


    【解决方案1】:

    来自objcopy manual page

    objcopy 可用于通过使用 binary 的输出目标生成原始二进制文件(例如,使用 -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 部分。

    【讨论】:

    • 迟到的感谢您的回答。不幸的是,我没有通过电子邮件收到有关答案的通知,抱歉。其实我设法找到了另一种方法来找出加载地址和入口点,但我的解决方案是针对具体情况的,不能普遍适用,所以我在这里不引用它。我只想说您提出的解决方案确实创建了一个 ELF 文件,但该文件不包含所需的重定位信息。因此,无法通过nm -n 从中提取信息。无论如何,感谢您的回答。
    猜你喜欢
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2021-08-17
    • 2013-07-31
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    相关资源
    最近更新 更多