【问题标题】:Undefined reference to an assembly function对汇编函数的未定义引用
【发布时间】:2014-06-26 08:00:09
【问题描述】:

要从 c++ 程序中调用汇编函数

我的简单汇编代码是(1.s)

.align 4
.code 32           
.globl testfunc 
.func 
 testfunc:
          bx lr
         .endfunc
 .end

C++ 代码是 (1.cpp)

#include <stdio.h>
#include <stdlib.h>

extern "C"
{
    void testfunc(void);
}

int main()
{
   testfunc();
   printf("completed\n");
   return 0;
}  

我使用 arm-none-linux-gnueabi-as -o 1.o 1.s

编译了汇编代码

当使用 arm-none-linux-gnueabi-g++ -o 1c.o 1.cpp 编译 C++ 代码时,得到一个错误

在 main 函数中,未定义对 testfunc() 的引用

为什么即使我将 testfunc() 声明为 extern 也会发生这种情况?

【问题讨论】:

  • 您必须将其声明为 extern "C" 才能正确修改名称。
  • 我使用了以下 extern "C" { void testfunc(void); } 仍然显示同样的错误
  • 嗯...也许还有一些其他的名字正在修改?一些编译器在 C 函数名称中添加下划线。编写一个小的 C 程序并查看生成的机器代码可能是最有启发性的。
  • 在编写汇编文件时,我总是写一点 C 代码并“复制”编译器的代码……例如arm-none-linux-gnueabi-g++ -S 1.cpp -o 1c.s
  • 尝试用 arm-none-linux-gnueabi-g++ -c 1.cpp 编译

标签: c++ linux gcc assembly cross-compiling


【解决方案1】:

如果编译参数列表是这种形式:

arm-none-linux-gnueabi-g++ -o 1c.o 1.cpp

这意味着用 1.cpp 做一些事情来获取目标文件作为输出。我不确定它会做什么,但在你的情况下,它也可以与链接一起使用。 当它是那种形式时

arm-none-linux-gnueabi-g++ -c 1.cpp

这意味着明确地只对文件 1.cpp 执行编译步骤。无需链接和解析依赖项

如果链接有问题 之后使用

objdump -T

在两个 .o 文件上检查函数的名称是否相同。下划线可能存在一些问题,一些编译器添加了一些不 检查你的函数是否用下划线编译,如果没有在汇编代码中手动添加

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-05
    • 2011-09-19
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 2017-11-11
    相关资源
    最近更新 更多