c++ 链接器选择仿真模式的机制是什么?

92dk7w1h  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(107)

我试图用avr-gnu编译器在代码块下编译arduino代码。我得到了这个错误:

avr-ld.exe unrecognized emulation mode: mcu=atmega328p.
Supported emulations:avr2 avr1 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega1 avrxmega2 avrxmega3 avrxmega4 avrxmega5 avrxmega6 avrxmega7 avrtiny

字符串
我发现这个页面:https://gcc.gnu.org/onlinedocs/gcc/AVR-Options.html这表明它应该在avr 5 sim模式下链接,所以我添加了-mmcu= avr 5链接器选项.现在我得到:

avr-ld.exe unrecognized emulation mode: mcu=avr5
Supported emulations:avr2 avr1 avr25 avr3 avr31 avr35 avr4 avr5 avr51 avr6 avrxmega1 avrxmega2 avrxmega3 avrxmega4 avrxmega5 avrxmega6 avrxmega7 avrtiny


如果avr 5被支持,它是如何被识别的?o 0我尝试了几个不同的工具链从几个不同的年份,但似乎链接器不能正确解释这种模拟模式。较新的工具链支持328 p,但仍然不知何故不工作。我也尝试创建专用于Arduino的CodeBlocks项目,但不同的是,它传递-mmcu= atmega 328 p本身,仍然不能在这个或较新的工具链上工作。更新:我在这里完全错过了一些东西。我从Mingw将链接器更改为标准的x86 32 ld.exe并传递-mmcu= i386 pe,我得到了类似的错误:

ld.exe unrecognized emulation mode: mcu=i386pe
Supported emulations:i386pe


因此,这只会导致我缺乏对链接器仿真模式如何选择/配置的机制的理解。

cxfofazt

cxfofazt1#

几乎在任何情况下,你都不想手动调用链接器(ldavr-ld)!
使用avr-gcc链接您的程序!
请注意,avr-gcc本身并不是一个编译器,它只是一个驱动程序,根据命令行选项和命令行上提供的输入文件调用子程序,如编译器(cc1用于C,cc1plus用于C++,lto1用于LTO编译的字节码),汇编器和链接器。
avr-gcc知道如何为相应的工具提供适当的命令行选项,如:仿真,库,包含和库的路径,启动代码,子选项等。
为了查看avr-gcc调用了哪些工具,请添加-v选项。

> avr-gcc -v main.c -mmcu=atmega328p -save-temps

字符串
你会看到类似这样的内容(avr-gcc v8.5.0):

...
COLLECT_GCC_OPTIONS='-v'  '-save-temps' '-specs=device-specs/specs-atmega328p' '-mmcu=avr5'

 $AVRGCC_HOME/bin/../libexec/gcc/avr/8.5.0/collect2 <many options> -plugin-opt=-pass-through=-latmega328p -mavr5 -Tdata 0x800100 $AVRGCC_HOME/bin/../lib/gcc/avr/8.5.0/../../../../avr/lib/avr5/crtatmega328p.o -L$AVRGCC_HOME/bin/../lib/gcc/avr/8.5.0/avr5 -L$AVRGCC_HOME/bin/../lib/gcc/avr/8.5.0/../../../../avr/lib/avr5 -L$AVRGCC_HOME/bin/../lib/gcc/avr/8.5.0 -L$AVRGCC_HOME/bin/../lib/gcc -L$AVRGCC_HOME/bin/../lib/gcc/avr/8.5.0/../../../../avr/lib main.o --start-group -lgcc -lm -lc -latmega328p --end-group


collect2只是 Package 对ld的调用的其他工具。如果您想看到真实的东西,请使用avr-gcc ... -v -Wl,-v

正确的Emulation

链接器的正确仿真是由位于编译器安装目录中./lib/gcc/avr/$version的设备特定规范文件device-specs/specs-atmega328p确定的。规范“语言”是描述选项Map的一种方式;特别是负责将-mmcu=atmega328pMap到正确仿真的位是

*link_arch:
    %{mmcu=*:-m%*} 
...

*self_spec:
    %{!mmcu=avr*: %<mmcu=* -mmcu=avr5} %<mshort-calls %<msp8


self_spec从命令行中删除-mmcu=*,并设置ATmega 328 P的核心系列-mmcu=avr5。然后,作为链接器调用的一部分,link_arch-mmcu=avr5Map到要使用的链接器仿真-mavr5

相关问题