【问题标题】:Position-independent code and vtable与位置无关的代码和 vtable
【发布时间】:2011-07-19 15:33:57
【问题描述】:

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

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

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

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

【问题讨论】:

  • 链接器知道,只要偏移量不跨越模块边界,它就不会遇到问题。找到一个真正做到这一点的人将是一个更难的问题。

标签: c++ gcc dynamic-linking virtual-functions vtable


【解决方案1】:

我建议您编写一些示例程序并使用例如 IDA Pro 自己检查它们。下载freeware versiondemo version

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      有两种选择:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-10
        • 2016-11-06
        • 2011-06-28
        • 1970-01-01
        • 2018-03-28
        • 1970-01-01
        相关资源
        最近更新 更多