与位置无关的代码和 vtable

发布于 2024-10-24 23:21:55 字数 234 浏览 1 评论 0原文

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

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

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

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

How are virtual functions implemented in position-independent code?

I know that if my class has virtual functions, the compiler usually generates a vtable for it that contains addresses of all virtual functions, and stores a pointer to the vtable in each object of my class.

Now, if my code is position-independent, the compiler cannot know addresses of virtual functions (or any function, for that matter). So what does it do?

I would like to know what real compilers do (not what is theoretically possible); i am mostly interested in linux 32-bit platforms but other platforms are slightly interesting too.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

征棹 2024-10-31 23:21:55

有两种选择:

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

There are two options:

  1. accept that your vtable is not going to be position independent, and try to move it away from the code section, so that all code that needs dynamic linking fixups lives next to each other in order to reduce the number of unshareable pages. gcc does this.
  2. use relative jumps in the vtable. I'm not aware of any implementation that does this, and it only works as long as the vtable lives at a fixed offset from the method implementations and these cannot be overridden at load time (which they can be on typical ELF systems).
落叶缤纷 2024-10-31 23:21:55

基本上,vtable 在任何地方都被实现为函数指针表。

Basically, a vtable is everywhere implemented as a table of function pointers.

北斗星光 2024-10-31 23:21:55

我建议您编写一些示例程序并使用 IDA Pro 等程序自行检查。下载免费软件版本演示版

I suggest that you write some example programs and examine them yourself with for example IDA Pro. Download the freeware version or demo version.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文