【问题标题】:Why can GCC assume VTables end up at 32-bit adresses为什么 GCC 可以假设 VTable 最终位于 32 位地址
【发布时间】: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


【解决方案1】:

这是 GCC 的小代码模型 (-mcmodel=small)。尝试将-mcmodel=large 添加到编译器选项中,看看它会如何生成movabsq

感谢How can gcc/clang assume a string constant's address is 32-bit?

【讨论】:

    猜你喜欢
    • 2016-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-11
    • 2016-08-09
    • 2017-09-22
    • 2017-06-05
    相关资源
    最近更新 更多