【问题标题】:How do I make g++ ignore -mregparm for certain code?如何让 g++ 忽略某些代码的 -mregparm?
【发布时间】:2010-10-15 21:27:07
【问题描述】:

一些背景:

作为个人项目,我一直在用 C++ 开发内核。一切进展顺利,事实上我对内核领域的大部分可用 c++ 都有很好的支持(我已经实现了几乎整个 libc 和 libstdc++)。

其中一个更困难且特定于编译器的事情是 RTTI 和异常支持。现在我完全禁用异常,但 RTTI 是我想要的,因为像 dynamic_cast 这样的东西可能非常有用。为了完成这项工作,我有一个与 g++ 期望相匹配的 std::type_info 的基本实现,然后我链接到 g++ 的 libsupc++.alibgcc_eh.a。这很好用。 RTTI 像冠军一样工作!

问题:

我一直在玩弄一些优化选项,并希望有朝一日将 -mregparm 作为编译时选项。显然这是一个内核并且必须与汇编代码交互,有些函数在堆栈上没有参数时不能很好地发挥作用。为了解决这个问题,我使用了以下宏:

#define asmlinkage  attribute((regparm(0)))

再一次,这非常有效。问题是当您执行dynamic_cast 时。编译发出对一些隐式定义的内部函数(在前面提到的支持库中定义)的调用,并且这样做尊重 -mregparm 标志。当然,由于我链接到系统的支持库,它们可能有也可能没有(在我的情况下它们没有)具有兼容的调用约定......导致漂亮的内核恐慌。由于这些函数是隐式的(在我的任何文件中都没有原型)并且它们的名称很长,而且名称混乱,因此(几乎)不可能将我的 asmlinkage 属性添加到它们。

我想到了 3 种可能的解决方案。

  1. 忘记支持 -mregparm 齐心协力。
  2. 重新编译这 2 个支持库 与内核相同的标志。这 可能有点烦人 不切实际(我不知道他们是否 可以与 gcc 完全隔离 构建和工具链升级可以 非常痛苦),但应该有效。
  3. 不知何故让编译器忽略 -mregparm 调用在特定 .a/.o 文件中找到的代码时。

选项 3 可能吗?我的直觉是没有,但我想我会问,因为这里有一些 g++ 大师 :-)。

【问题讨论】:

    标签: c++ operating-system g++ kernel


    【解决方案1】:

    您可能最好使用选项 1 或 2(1 显然更容易)。据我所知,g++ 没有针对选项 3 的特定开关。

    【讨论】:

      猜你喜欢
      • 2018-03-10
      • 2013-08-24
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-30
      • 2019-10-29
      • 2012-08-21
      相关资源
      最近更新 更多