当前位置: 首页 > 知识库问答 >
问题:

更改gcc/g abi中的调用约定

於炯
2023-03-14

我如何强制gcc/g不使用寄存器,而只使用x86\u 64中的堆栈将参数传递给函数,就像在32位版本中一样(并可能以这种方式获取函数结果)。我知道它破坏了官方ABI,调用方和被叫方都必须以这种方式编译,这样它才能工作。我不在乎是否使用推送/弹出或移动/子方式。我希望编译器应该有一个可以强制执行它的标志,但我找不到它。

共有1个答案

喻高寒
2023-03-14

似乎你不能不入侵GCC的源代码。

没有使用效率低下的堆栈参数的标准x86-64调用约定。

GCC只知道如何使用标准调用约定,在本例中是x86-64 SysV和MS Windows fastcall和vectorcall。(例如\uu attribute\uuu((ms\u abi))矢量调用(vectorcall))。通常没有人想要这个;MS的调用约定对于包装器或变量函数来说已经足够友好了。即使在为Linux、MacOS、*BSD等编译时,您也可以将其用于某些函数(由属性控制),如果这样有帮助的话。很难想象纯堆栈参数的用例。

GCC允许您将寄存器指定为固定的(GCC从未接触过,例如-ffixed-rdi)、调用重击的或调用保留的。但是使用带有arg传递寄存器的寄存器只会创建错误的代码,而不是您想要的。

e、 g。

int foo(int a, int b, int c);

void caller(int x) {
    foo(1,2,3);
    //foo(4,x,6);
}

编译gcc9.2-O3-fcall-保存-rdi

caller:
        push    rdi
        mov     edx, 3
        mov     esi, 2
        pop     rdi
        jmp     foo

它保存/恢复RDI,但在调用foo之前,不会在RDI中放入1。

而且它不会将RDI排除在arg传递序列之外,并在稍后碰撞其他arg。(我在想,您可能能够发明一种调用约定,其中所有通过arg的寄存器都是固定的,或者保存了调用,也许可以让GCC返回堆栈arg。但是没有。)

 类似资料:
  • 我希望将clob列的约束更改为约束。但是,当尝试 或 我做错了什么?在这种情况下,我也必须使用临时栏吗?我知道使用temp列将数据类型从clob更改为varchar2的场景,但这里我只想更改约束。为什么这是不可能的? 提前感谢!

  • 问题内容: 尝试更改表时出现此错误。 这是我成功运行的CREATE TABLE STATEMENT。 然后,我尝试执行此语句,但出现了以上错误。 问题答案: 外键字段和引用的类型和定义必须相同。这意味着您的外键不允许更改字段的类型。 一种解决方案是: 现在您可以更改您的person_id 重新创建外键 编辑: 上面添加了锁,感谢评论 在执行此操作时,您必须禁止写入数据库,否则可能会冒数据完整性问题

  • 问题内容: 我已经在已经具有gcc / g -4.4的ubuntu 11.04上安装了gcc-3.3 / g -3.3。所以在我的系统中gcc-3.3和4.4都可用。我可以根据需要调用两个编译器。如果我只是调用命令,那么将调用gcc-4.4。要调用gcc-3.3,我必须使用命令。 如何将默认编译器更改为gcc-3.3?当我执行命令时,它应该调用gcc-3.3而不是gcc-4.4。 另外,如何将ma

  • 问题内容: 从这个答案: 这是被接受的答案建议为您的视图变化设置动画: 不 更改框架时为什么要打电话。我们正在更改约束,所以(根据[另一个答案]我们不应该打电话吗? 如果以后发生的更改使您的约束之一无效,则应立即删除约束并调用setNeedsUpdateConstraints 观察结果: 我实际上确实尝试过同时使用它们。使用我的视图 可以向右正确设置动画 但是,使用 不会 设置动画,它只是将视图

  • 从这个答案中: 以下是公认的答案建议的动画视图更改: 当我们不更改帧时,为什么要调用。我们正在更改约束,所以(根据另一个答案)我们不应该调用? 同样,这个备受好评的答案说: 如果以后发生的某些更改使某个约束无效,则应立即删除该约束并调用setNeedsUpdateConstraints 我确实试过两种方法。使用my view可正确向左设置动画 但是,使用不会设置动画,它只是将视图快速向左移动。 如

  • 所以我正在学习如何使视图从屏幕外变成动画,用作滑块菜单。 我改编了这段代码,从如何在Swift中使用约束对UIView进行动画制作? 什么是自我。看法layoutIfNeeded()部分代码如何? 2.为什么在动画之前和期间编码为2x? 注:如果我注释掉第一个自我。看法layoutIfNeeded()没有任何变化,但如果我注释掉第二个self。看法layoutIfNeeded()移动不再设置动画,