AVR-GCC不链接c++与汇编函数

AVR-GCC Not Linking C++ with Assembly Function

本文关键字:汇编 函数 c++ 链接 AVR-GCC      更新时间:2023-10-16

我试图从c++调用一个汇编函数,并且链接器说我试图调用的函数不存在。下面是错误:

avr-gcc -mmcu=atmega328 -Wall -o main.elf hello.S main.cpp
/tmp/ccS7uaAX.o: In function `main':
main.cpp:(.text+0x14): undefined reference to `hello(char, char, char, char, char)'
collect2: error: ld returned 1 exit status

来源:

//Somewhere in hello.S
.global hello
hello:
    ret
//In main.cpp
extern void hello(char, char, char, char, char);
int main(){
    hello(1, 2, 3, 4, 5);
}

如果这有帮助,下面是我将这些文件编译成目标文件后的反汇编:

这里是main.o:

00000000 <main>:
   0:   0f 93           push    r16
   2:   cf 93           push    r28
   4:   df 93           push    r29
   6:   cd b7           in  r28, 0x3d   ; 61
   8:   de b7           in  r29, 0x3e   ; 62
   a:   05 e0           ldi r16, 0x05   ; 5
   c:   24 e0           ldi r18, 0x04   ; 4
   e:   43 e0           ldi r20, 0x03   ; 3
  10:   62 e0           ldi r22, 0x02   ; 2
  12:   81 e0           ldi r24, 0x01   ; 1
  14:   0e 94 00 00     call    0   ; 0x0 <main>
  18:   80 e0           ldi r24, 0x00   ; 0
  1a:   90 e0           ldi r25, 0x00   ; 0
  1c:   df 91           pop r29
  1e:   cf 91           pop r28
  20:   0f 91           pop r16
  22:   08 95           ret

这里是hello.o:

00000000 <hello>:
   0:   08 95           ret

我已经找了几个小时了,我真的不知道发生了什么。

每个文件单独编译,我认为是链接搞砸了。

我也可以编译纯汇编没有任何问题。

任何帮助将不胜感激,我刚刚开始寻找混合汇编和c++的AVR。

试试这个:在main.cpp中,

extern "C" void hello(char, char, char, char, char); 

中有一个"C"。c++更改函数的名称以包含它的类型,这被称为名称mangling。"C"告诉编译器不要混淆。汇编器不会乱码,所以编译器需要知道不要乱码。

顺便说一下,混淆是链接器如何能够告诉您它正在寻找的hello的参数类型。

编辑在当前对象文件上执行strings main.o |grep hello,您将看到对hello的引用,后面有各种有趣的字符。