7

位置无关代码中的虚函数是如何实现的?

我知道如果我的类有虚函数,编译器通常会为它生成一个包含所有虚函数地址的虚表,并在我的类的每个对象中存储一个指向虚表的指针。

现在,如果我的代码与位置无关,编译器就无法知道虚函数(或任何函数)的地址。那么它有什么作用呢?

我想知道真正的编译器做了什么(不是理论上可能的);我最感兴趣的是 linux 32 位平台,但其他平台也有点有趣。

4

3 回答 3

9

有两种选择:

  1. 接受您的 vtable 不会与位置无关,并尝试将其从代码部分移开,以便所有需要动态链接修复的代码彼此相邻,以减少不可共享页面的数量。gcc 这样做
  2. 在 vtable 中使用相对跳转。我不知道有什么实现可以做到这一点,而且它只有在 vtable 存在于方法实现的固定偏移处并且在加载时不能被覆盖(它们可以在典型的 ELF 系统上)时才有效。
于 2011-03-21T12:29:20.920 回答
-1

基本上,vtable 到处都是作为函数指针表实现的。

于 2011-03-21T12:26:23.600 回答
-2

我建议您编写一些示例程序并自己检查它们,例如 IDA Pro。下载免费版演示版

于 2011-03-21T12:25:49.920 回答