【问题标题】:Why does the `--oformat binary' option of the gnu linker place the `.data' segment at 0x0200000为什么 gnu 链接器的 `--oformat binary' 选项将 `.data' 段放置在 0x0200000
【发布时间】:2012-05-16 11:12:44
【问题描述】:

我一直在为 i386 实模式编写一些“独立”代码,并在 PXE 网络引导我的代码时遇到了一些奇怪的错误:

PXE-E79: NBP is too big to fit in free base memory
PXE-M0F: Exiting Intel Boot Agent.

在对我的二进制文件进行了多次摆弄之后,我将其隔离为在

之后具有任何数据或代码
.data

分段标记。

在 hexdumping 之后,我发现 ld 将指令一直移动到所有位置的 0x0200000

我目前正在生成我的平板箱:

ld --oformat binary

问题:

  1. ld 为什么要这样做?

  2. 这是否特定于 oformat 选项?

【问题讨论】:

    标签: assembly ld att


    【解决方案1】:

    1) 链接器这样做可能是因为它感觉像它(例如,可能是为了与 80x86 上的“2 MiB 页面”对齐),并且因为您没有提供一个链接器脚本来说明除了“无论如何链接器感觉像”。

    2) 我假设所有输出格式“无论链接器感觉如何”(除非链接器另有说明)。

    注意:实际行为可能由隐藏在某处的默认链接器脚本确定,并且可能是“无论操作系统的分发方式如何”,而不仅仅是“链接器感觉如何”。

    在任何情况下,如果您希望链接器执行特定的操作,您需要通过编写链接描述文件具体告诉链接器您想要什么。如果您确实编写了“不太具体”的链接器脚本,那么您需要使该脚本更具体。

    【讨论】:

    • 谢谢,如果有人知道它究竟为什么这样做,我会留下这个问题。不过感谢您的回答。
    • 2 MiB 页面是什么意思?
    【解决方案2】:

    1-ld 使用默认链接描述文件。试试 -v 查看你的默认值 2-不特定于oformat 3-要设置另一个尺寸,您必须使用 -z max-page-size=0x

    我尝试使用 0x100 和 0x1000 并且工作正常,但 0x500 不行。

    Salu2 总计

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 2017-06-24
      • 2011-05-28
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      相关资源
      最近更新 更多