0

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

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

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

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

4

2 回答 2

2

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

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

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

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

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

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

于 2013-09-13T12:12:48.640 回答
0

使用 GCC 时,此页面解释了如何在绝对地址处定义变量(包括提及它们应该驻留的部分):https ://mcuoneclipse.com/2012/11/01/defining-variables-at-absolute-addresses-与-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 a absolute address with GCC?中提到了另一种方法?

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

于 2017-02-27T10:39:12.270 回答