2009-12-23 190 views
0

我在称为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中似乎不再是这种情况。

如何通过使用编译指示,编译器/链接器设施或类似命令来查找函数或整个命名空间/存根的大小?

+1

命名空间并不意味着所包含的类型和函数的存储空间,它们是一个语法工具。 – 2009-12-23 15:20:31

+0

我知道,但基本上问题是关于任何种类的函数(给定第一个和最后一个函数,其中最后一个函数也可能是空的,如示例中所示) – 2009-12-23 15:21:18

+1

编译器不必订购代码按照声明的顺序,一旦启用优化,肯定不会。 – 2009-12-23 15:28:46

回答

1

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

0

C++语言不提供用于查找名称空间的地址或大小的保证。这就是说,冒险进入汇编语言和链接器指令。

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

总之,使用您的汇编和链接器工具来定义名称空间开始和长度的公共符号,或者可选地定义段的结尾。在你的C++程序中,访问这些标签为extern

+0

你可以举例说明Visual C++中的指令吗? – 2009-12-23 19:55:14

相关问题