C++ 位置独立代码和vtable

C++ 位置独立代码和vtable,c++,gcc,dynamic-linking,virtual-functions,vtable,C++,Gcc,Dynamic Linking,Virtual Functions,Vtable,如何在位置无关的代码中实现虚拟函数 我知道,如果我的类有虚拟函数,编译器通常会为它生成一个vtable,其中包含所有虚拟函数的地址,并在类的每个对象中存储指向vtable的指针 现在,如果我的代码是位置独立的,编译器就不能知道虚拟函数(或者任何函数)的地址。那么它有什么作用呢 我想知道真正的编译器做什么(而不是理论上可能的);我最感兴趣的是linux 32位平台,但其他平台也有点感兴趣。我建议您编写一些示例程序,并使用例如IDA Pro亲自检查它们。下载或。基本上,vtable是作为函数指针表实

如何在位置无关的代码中实现虚拟函数

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

现在,如果我的代码是位置独立的,编译器就不能知道虚拟函数(或者任何函数)的地址。那么它有什么作用呢


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

我建议您编写一些示例程序,并使用例如IDA Pro亲自检查它们。下载或。

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

有两种选择:

  • 接受您的vtable不会是位置独立的,并尝试将其从代码部分移开,以便所有需要动态链接修复的代码彼此相邻,以减少不可分区页面的数量gcc做到了这一点
  • 在vtable中使用相对跳转。我不知道有任何实现可以做到这一点,它只在vtable与方法实现之间存在固定偏移量的情况下工作,并且这些偏移量不能在加载时被覆盖(在典型的ELF系统上)

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