gpt4 book ai didi

从全局内联汇编调用静态函数

转载 作者:行者123 更新时间:2023-12-04 11:47:19 26 4
gpt4 key购买 nike

我试图定义一个没有任何序言/结尾的函数,一个“登陆地址”,这样它就可以调用一个由编译器正确管理的内部函数(对于调用者清理环境很有用)。

我发现我可以使用内联程序集创建全局标签,但是我无法在同一文件中调用另一个函数。
当我编译这里列出的代码时,我收到一条警告:

WARNING: "handle_vmexit" [/Code/hyper/kernel/hyper.ko] undefined!



当我删除静态修饰符时,没有问题。

所以我的问题是,为什么内联程序集在静态时无法与 handle_vmexit 链接,以及如何让它调用静态 handle_vmexit。

这是相关的代码:
static void handle_vmexit(void){
...
}

__asm__(".handle_vmexit: \n\t"
"call handle_vmexit"
);

最佳答案

声明 C 函数时 static ,它对其他翻译单元不可见,因此 C 编译器假设它可以看到它的每一次使用,并根据该假设做出优化决策。如果该函数未使用,编译器可能无法完全为其发出代码;如果它只使用一次,它可能会被内联到它的唯一调用者中,并且不会单独发出它的符号(GCC 选项 -finline-functions-called-once),依此类推。编译器甚至可能决定内联所有调用,即使您不使用 inline关键字你自己(选项 -finline-functions)。*

但是,GCC 无法检测内联汇编中的用法;汇编代码对 GCC 是完全不透明的。要强制编译器无论如何都要为此函数单独发出代码,请使用 __attribute__((used)) ;该属性是专门为此目的添加的。说明书describes the attribute如下:

used
This attribute, attached to a function, means that code must be emitted for the function even if it appears that the function is not referenced. This is useful, for example, when the function is referenced only in inline assembly.

When applied to a member function of a C++ class template, the attribute also means that the function is instantiated if the class itself is instantiated.



* 严格来说,即使函数的代码是单独发出的,编译器也可以完全不在生成的汇编文件中声明通常的命名符号,而是通过一些不透明的、人为生成的标识符来引用函数,例如做标签。但我认为 GCC 不可能利用这种自由,特别是如果应用这里给出的解决方案。

关于从全局内联汇编调用静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59116504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com