【问题标题】:How to specify custom section start addresses for PE sections?如何为 PE 部分指定自定义部分起始地址?
【发布时间】:2013-09-12 16:20:52
【问题描述】:

在 Linux 上,链接时我可以为一个部分指定任何虚拟地址:

ld -Ttext 0x10000000 -Tdata 0x20000000 foo.o -o foo

但是对于 Windows 的 link.exe,我没有看到这样的选项。

是否可以通过某种方式指定 PE 部分的起始地址?

【问题讨论】:

  • 那是因为这样的选项根本不存在。可以在任何 VM 地址加载节,代码和数据引用可在 Windows 上重定位。
  • @HansPassant MinGW ld 可以以某种方式做到这一点。转储此类二进制文件表明它将段放置在基地址 + 段地址。调试这样的过程向我展示了文本和数据在这些地址。我可以使用 MinGW,但如果可能的话,我想使用标准的 MSVC 工具链。

标签: windows linker portable-executable


【解决方案1】:

MinGW ld 可以将节放在任意地址。垃圾箱和反汇编程序可以毫无问题地处理它。

但似乎 Windows 只接受默认地址:如果您尝试将其设置为不同的值,Windows 会说“不是有效的 Win32 应用程序”。

基地址必须是 0x400000 或 0x1000000。

.text 部分必须位于 0x401000 或 0x1001000。

此外,各部分之间似乎不允许有间隙。如果我尝试将 .data 部分放置到 0x403000 而不是 0x402000,则 Windows 无法加载它...

(我可能错了,或者 mingw ld 有问题...)

【讨论】:

    【解决方案2】:

    使用 GCC 时,此页面解释了如何在绝对地址定义变量(包括提及它们应该驻留的部分):https://mcuoneclipse.com/2012/11/01/defining-variables-at-absolute-addresses-with-gcc/

    我在这里使用的想法是把变量放在一个特殊的部分 名称,然后将其放在链接器文件中的绝对地址处。

    unsigned char __attribute__((section (".myBufSection"))) buf[128]
    __attribute__ ((aligned (512)));
    

    这样,我的变量将被放入一个名为 ‘.myBufSection’,它将在 512 地址边界上对齐。 下一步是将该节放在链接器文件中的地址处。

    SECTIONS
    {
      /* placing my named section at given address: */
      .myBufBlock 0x20000000 :
      {
        KEEP(*(.myBufSection)) /* keep my variable even if not referenced */
      } > m_data
    
      /* other placements follow here... */
    }
    

    PS:How can I declare a variable at an absolute address with GCC?中提到了另一种方法

    PS 2:另一个相关的(唉未回答的)问题是:How to place a variable at a given absolute address in memory (with Visual C++)

    【讨论】:

    • 有谁知道 Visual C(++) 的方法吗?
    猜你喜欢
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2013-12-24
    • 1970-01-01
    • 2023-04-04
    • 2010-09-23
    • 2010-12-18
    • 1970-01-01
    相关资源
    最近更新 更多