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

时间:2014-02-15 04:36:14

标签: gcc assembly arduino 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);
}

我得到的错误是 -

small_sample.S.o:在函数call_my_c_add': small_sample.S:12: undefined reference to my_c_add'中 collect2:ld返回1退出状态

这是我用于链接的命令 -

arm-none-eabi-g ++ -O3 -Wl, - gc-sections -mcpu = cortex-m3 -T flash.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, - start-group some.co some2.cpp.o assembly.So somelib.a -Wl, - end-group

1 个答案:

答案 0 :(得分:0)

g ++编译器会进行一些名称修改。您可能还需要在extern "C"上添加my_c_add,以便为该功能禁用它。

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