【问题标题】:how to get the address of an asm function in c如何在c中获取asm函数的地址
【发布时间】:2015-08-26 16:18:53
【问题描述】:

我有一个 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;

【问题讨论】:

  • 你怎么知道它没有包含正确的地址?
  • 我已经使用命令 x/i 使用 gdb 检查了内存。
  • 好点 :) 您可能希望将此信息添加到您的原始问题中作为编辑。
  • 为什么不简单地创建一个原型,并像使用任何其他自然衰减到函数指针的函数一样使用它?如果您不确定,请使用地址运算符,如&myfunc。然后让链接器解析地址。
  • 我还是不明白你在比较什么。您如何获得“正确”地址,以及如何查看“错误”地址?您可以将步骤添加到问题正文中吗?

标签: c gnu-assembler


【解决方案1】:

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

extern void myfunc(void);

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 2014-01-03
    • 2020-03-02
    • 1970-01-01
    相关资源
    最近更新 更多