1

一些背景:

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

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

问题:

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

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

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

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

  1. 忘记一起支持-mregparm。
  2. 使用与内核相同的标志重新编译这 2 个支持库。这可能很烦人并且有点不切实际(我不知道它们是否可以与 gcc 构建完全隔离,并且工具链升级可能非常痛苦),但应该可以。
  3. 以某种方式使编译器在调用特定 .a/.o 文件中的代码时忽略 -mregparm。

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

4

1 回答 1

1

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

于 2009-03-27T08:39:10.983 回答