确定内存中函数/存根/命名空间的大小

时间:2009-12-23 15:16:09

标签: c++ visual-c++ visual-c++-2010

我在名为stub的命名空间中有几个函数。 我必须确定命名空间的确切起始地址和结束地址,至少是内存中命名空间的大小(将这些函数复制到另一个进程中)。 虽然这在Visual C ++ 2008中通过添加

完美地工作
void stub_end() { }

在命名空间的末尾并使用

size_t size = reinterpret_cast<ULONG_PTR>(stub_end) - reinterpret_cast<ULONG_PTR>(stub_start);

确定存根的大小。

这很有效,因为Visual C ++保留了.cpp文件中的函数顺序,但是在Visual C ++ 2010中似乎不再是这种情况。

如何使用pragma指令,编译器/链接器工具或类似工具找出函数或整个命名空间/存根的大小?

3 个答案:

答案 0 :(得分:1)

随着近来安全性的新推动(堆随机化,layout randomization等),我认为这将变得更加困难。您可能最终只需要单独复制每个功能。

答案 1 :(得分:0)

您可以尝试使用VC ++等效GCC的属性((section(“name”)))http://www.delorie.com/gnu/docs/gcc/gcc_62.html将每个函数放在不同的部分中,然后使用您的技术,或者您可以将每个函数放在不同的源文件中。

答案 2 :(得分:0)

C ++语言无法保证查找名称空间的地址或大小。也就是说,冒险使用汇编语言和链接器指令。

许多汇编语言都有一个操作码或助记符,用于在特定地址放置代码。这允许设置标签以指示存储区的开始。一些链接器具有用于获得段起始地址和大小的变量。这些是用户定义的逻辑地址。

总之,使用程序集和链接器工具为命名空间的起始和长度或可选的段末尾定义公共符号。在您的C ++程序中,请将这些标签作为extern

进行访问