【问题标题】:Is there a way to strip executable HEADERS (not sections)?有没有办法去除可执行的标题(不是部分)?
【发布时间】:2022-01-14 14:14:12
【问题描述】:

我正在尝试为我的操作系统编写系统加载程序,但我使用的是 LLVM(clang-cl.exelld-link.exe)的编译器,因为我的操作系统使用 PE 文件作为本机可执行文件类型。问题是,LLVM 和 MSVC 似乎都没有办法(至少从我能找到的)来创建原始二进制文件(例如,在 nasm 中,您可以使用选项:nasm -f bin <...> 创建“平面”二进制文件)。我不希望系统加载器成为可执行文件。我在想,如果我可以删除可执行文件 headers 并保留这些部分,可能会有办法做到这一点,但我找不到这样做的方法。任何人都知道从可执行映像中去除 headers 的方法吗?

【问题讨论】:

  • 当您删除标题并保留部分时,文件的其余部分将不是有效的 PE 文件。
  • @SemihArtan 这是我的目标:它不应该是一个有效的 PE 文件。它应该类似于使用 nasm 汇编器 nasm -f bin 创建原始代码文件。

标签: linker bootloader portable-executable


【解决方案1】:

您可以去除标题,但不能保留该部分,因为部分也是标题。您必须从文件中提取部分指定的原始数据(.text、.bss、.data 等),但 .text 部分指向的原始数据中的机器代码将无法按原样执行。例如,由于 32 位机器代码中的地址是映像基地址的相对地址,因此您需要修补这些地址(还有一种叫做重定位的东西。您必须处理它)。总而言之,您应该直接提取文件中各个部分所指向的原始数据(您不需要留下任何东西)并且您必须修补代码中的地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    相关资源
    最近更新 更多