【发布时间】:2019-05-07 20:25:02
【问题描述】:
考虑以下程序:
#include <iostream>
class A {
public:
A() {}
virtual void a() {};
};
class B : public A { };
int main() {
B();
}
GCC(测试 4.4.0、8.3.0 和 9.1)为 B::B() (godbolt link) 生成以下代码:
call A::A() [base object constructor]
movl $vtable for B+16, %edx
请注意,它在 64 位程序中执行 32 位移动。 GCC 如何确定存储 vtable 的 .text 部分最终会以 32 位地址结束?
【问题讨论】:
-
因为 GCC 知道一切都在哪里,因为它自己负责将数据放在那里?
-
好吧,我假设它可以为链接器提供正确的标志,以便以这种方式排列它。我想知道它在汇编器输出中出现在哪里,但它似乎不是。例如。链接生成的 a.out 时,您必须提供正确的链接器标志。
标签: gcc