在 Linux 上,链接时我可以为一个部分指定任何虚拟地址:
ld -Ttext 0x10000000 -Tdata 0x20000000 foo.o -o foo
但我没有看到 Windows 的 link.exe 有这样的选项。
是否可以以某种方式指定 PE 部分的起始地址?
在 Linux 上,链接时我可以为一个部分指定任何虚拟地址:
ld -Ttext 0x10000000 -Tdata 0x20000000 foo.o -o foo
但我没有看到 Windows 的 link.exe 有这样的选项。
是否可以以某种方式指定 PE 部分的起始地址?
MinGW ld 可以将这些部分放在任意地址。垃圾箱和反汇编程序可以毫无问题地处理它。
但似乎 Windows 只接受默认地址:如果您尝试将其设置为不同的值,Windows 会说“不是有效的 Win32 应用程序”。
基地址必须是 0x400000 或 0x1000000。
并且 .text 部分必须位于 0x401000 或 0x1001000。
此外,各部分之间似乎不允许有间隙。如果我尝试将 .data 部分放置到 0x403000 而不是 0x402000,则 Windows 无法加载它...
(我可能错了,或者 mingw ld 有问题......)
使用 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++)