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

从Arm thumb2调用c函数时发生链接器错误

孔和风
2023-03-14

我在从arm组件调用c函数时遇到问题。反之亦然。Arch是cortex-m3,董事会到期。编译器是gcc。

以下是汇编代码:

.syntax unified
.section .text
.thumb_func
.cpu cortex-m3
.extern my_c_add
.global call_my_c_add

call_my_c_add:                    @ r0 - x, r1 - y
    bl my_c_add
    bx  lr                 @ return

这里是c代码:

#include <Arduino.h>
#include <SPI.h>
#include <Ethernet.h>

extern "C" unsigned int call_my_c_add (unsigned int, unsigned int);

unsigned int my_c_add(unsigned int, unsigned int);

unsigned int x=20;
unsigned int y = 15;

void setup()
{
    Serial.begin(115200);
    Serial.println("exiting setup");
}
void loop()
{
        unsigned int z = 0;

        z = call_my_c_add (x, y);
        Serial.print("c calling asm calling c, addition is - ");
        Serial.println(z);
}
unsigned int my_c_add(unsigned int x, unsigned int y)
{
    return (x+y);
}

我得到的错误是-

小样本。S.o:在函数中调用_my_c_add':小样本。S:12:未定义对my_c_add'collect2:ld的引用返回1退出状态

下面是我用来链接的命令-

arm-none-eabi-g-O3-Wl,--gc切片-mcpu=cortex-m3-T闪光。ld-Wl,-Map,mapfile-o elffile-L somefile-lm-lgcc-mthumb-Wl,--cref-Wl,-check sections-Wl,--gc sections-Wl,--entry=Reset_Handler-Wl,--unresolved symbols=report all-Wl,--warn common-Wl,--warn section align-Wl,-,-启动组some。c、 o some2。cpp。o组装。S.o somelib。a-Wl,——端基

共有1个答案

艾嘉石
2023-03-14

g编译器会对名称进行一些修改。您可能还需要在my_C_add上添加extern“C”,以禁用该功能。

尝试在两个对象文件上运行arm none eabi nm,并检查从C/C编译的对象中定义的符号的名称是否与从汇编编译的对象中定义的符号的名称相同。

 类似资料:
  • 问题内容: 我需要针对将返回零或一的数据库运行查询(检查是否存在特定条件)。我已获得审查的技术规范指出,我应该创建一个存储过程,该存储过程将返回单行,并带有称为“结果”的单列,该列将包含0或1的位值。我不确定存储过程将是最好的方法,但是不确定一点,所以我想请教您一些意见。我可以想到的两个选择是: 1:创建一个SQL标量值函数,该函数执行查询并返回一点。然后,可以使用“ TEXT” SqlComma

  • 问题内容: 我正在尝试创建一个用Go语言编写的静态对象,以与C程序(例如内核模块等)进行接口。 我已经找到了有关从Go调用C函数的文档,但是关于如何走另一条路却找不到很多。我发现这是可能的,但很复杂。 这是我发现的: 有关C和Go之间的回调的博客文章 CGO文档 Golang邮件列表帖子 有任何人对此有经验吗?简而言之,我正在尝试创建一个完全用Go编写的PAM模块。 问题答案: 您可以从C调用Go

  • 问题内容: 我正在尝试从C ++实现调用Python函数。我以为可以通过函数指针来实现,但是似乎不可能。我一直在使用以完成此任务。 假设在Python中定义了一个函数: 现在,我需要将此函数传递给C ,以便可以从那里调用它。如何在C 端编写代码以实现此目的? 问题答案: 如果可以使用任何名称: 将其传递给需要一个的函数。 如果它在具有相同名称的单个已知名称空间中: 已定义,因此您可以像调用任何函数

  • 其实,类似的问题这里问过,那里问过,但回答都不满意。代码示例是 输出为 关于 由于是虚函数,派生类不实现它,因此程序将调用; 则程序将调用; 是一个常规函数,程序将调用; 也是一个常规函数,程序将调用; 我不明白的部分来了,不是虚函数,是属于的指针,基本上只能访问中的函数!但输出是 相比之下,会像我想的那样调用。 在基类指针只能访问基类和虚函数中定义的函数的原则与实际输出之间似乎存在矛盾。原因也无

  • 我认为我的模板使用不当,但我不知道我做错了什么。这就像模板链表无法确定它需要使用我的术语类一样。 名单- 以下是Visual Studio 2012的确切错误: > 错误LNK1120:1未解决的外部C:\用户\迈克尔\文档\魔术公文包\尚普兰\课程工作\数据结构\pa2\调试\pa2.exe 标题。H 功能。cpp 链接列表。H 术语h