如何在c中获取asm函数的地址

how to get the address of an asm function in c

我有一个 asm 文件(我正在使用 gas)和一个 c 文件。我的 asm 文件包含一个函数,类似这样

.global myfunc
.type myfunc, @function

myfunc:
   pusha
   .
   .
   .

现在我想从我的c文件中获取标签myfunc的地址,所以我写了

extern uintptr_t _myfunc asm("myfunc");

我的程序链接没有问题,但是当我执行我的程序时,变量 _myfunc 不包含正确的地址。

编辑 1

知道这段代码是裸机程序的一部分可能有用

编辑 2

使用函数原型解决了问题

void function() asm("myfunc");

uintptr_t _myfunc = (uintptr_t)&myfunc;

您应该能够使用您在 .global 声明中使用的相同符号在 C 中声明您的 asm 函数:

extern void myfunc(void);

符号由链接器解析。只要从您的 asm 文件创建的目标文件导出符号 myfunc,您的 C 源代码的目标文件就可能包含对它的未定义引用。

根据特定的 ABI 或目标文件格式(a.out 与 ELF),您可能需要在 extern 声明中使用 _myfunc 而不是 myfunc