Arduino上“Collect2.exe: error: ld returned 5 exit status”错误的解决方法

摘要:
在国外的论坛上有大量的用低版本的Arduino的ld.exe代替的解决方法,可能是低版本的ld.exe不调用ntdll.dll,但是,有的也不好用。经过分析正确的链接过程,使用avr-objcopy,用批处理完成elf文件到hex文件的生成。创建一个elf2hex.bat文件,把如下内容写到elf2hext.bat文件中。"D:arduino-1.6.11hardwareoolsavr/bin/avr-objcopy"-Oihex-j.eeprom--set-section-flags=.eeprom=alloc,load--no-change-warnings--change-section-lma.eeprom=0"d:Arduino_Hex/pelican.ino.elf""d:Arduino_Hex/pelican.ino.eep""D:arduino-1.6.11hardwareoolsavr/bin/avr-objcopy"-Oihex-R.eeprom"d:Arduino_Hex/pelican.ino.elf""d:Arduino_Hex/pelican.ino.hex"根据你的应用,替换掉pelican文件名,其中d:Arduino_Hex是Arduino编译的目标目录,是自己创建的。.运行elf2hex.bat文件,在目标中会出现hex文件。

1.运行环境

Windows xp;
Arduino1.6.11 IDE.

2.问题

在Arduino编译时,经常出现如下的错误:
collect2.exe: error: ld returned 5 exit status
exit status 1
Error compiling for board Arduino Duemilanove or Diecimila

打开Arduino中编译过程显示的开关,可以知道,编译文件时没有错误,只是在链接时出现了错误。自己做一个批处理,在命令行中重新运行出错的链接部分,会弹出一个窗口,是“内存不能为读”错误。之后就退出了。

链接问题
图1. 在命令行中重新链接时弹出的窗口

3.问题的本质

经过错误代码跟踪,问题不是出在Arduino上,而是在windows XP的ntdll.dll模块上,Arduino的链接程序ld.exe调用了ntdll.dll模块的功能时出了错误,在其中返回(ret)时,进入了无权限的区域,只有修复ntdll.dll才可以从根本上解决以上问题。在windows xp和windows 7上可能会出现上边的错误,而论坛中说,在windows 10上不会出现上边的问题。在国外的论坛上有大量的用低版本的Arduino的ld.exe代替的解决方法,可能是低版本的ld.exe不调用ntdll.dll,但是,有的也不好用。

错误跟踪1
图2. ntdll.dll模块内出现的错误

4.折中解决方法

经过观察,虽然链接时出现了错误,但是,在目标目录中,已经生成了elf文件,却没有hex文件,也就是链接时,在生成elf文件后出现了调用ntdll.dll的错误, 中止了下边要进行的elf生成hex文件的工作。

经过分析正确的链接过程,使用avr-objcopy,用批处理完成elf文件到hex文件的生成。

创建一个elf2hex.bat文件,把如下内容写到elf2hext.bat文件中。

"D:arduino-1.6.11hardware oolsavr/bin/avr-objcopy" -O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 "d:Arduino_Hex/pelican.ino.elf" "d:Arduino_Hex/pelican.ino.eep"
"D:arduino-1.6.11hardware oolsavr/bin/avr-objcopy" -O ihex -R .eeprom "d:Arduino_Hex/pelican.ino.elf" "d:Arduino_Hex/pelican.ino.hex"

根据你的应用,替换掉pelican文件名,其中d:Arduino_Hex是Arduino编译的目标目录,是自己创建的【1】。

5.使用

(1).先正常使用Arduino编译,看是否生成elf文件(我的情况是总会生成的),有的时候,有collect2.exe: error: ld returned 5 exit status错误。退出了。但是elf文件已经生成。

(2).运行elf2hex.bat文件,在目标中会出现hex文件。

参考:
【1】Arduino设置:http://www.cnblogs.com/hyper99/p/Arduino-UNO-fang-zhen-kai-fa-huan-jing-she-zhi-he-.html

免责声明:文章转载自《Arduino上“Collect2.exe: error: ld returned 5 exit status”错误的解决方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇报错[Vue warn]:Invalid prop:custom validator check failed for prop "percentage"java Process在windows的使用汇总(转)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Arduino IDE for ESP8266教程(四)网页控制灯 简单页面

修改ssid和passwd,将程序烧写到8266上,等待串口返回连接成功的消息,连接成功之后可以看到返回有一个ip地址,使用浏览器方位这个ip地址就可以看到这个消息: 连接路由器后,返回IP地址 192.168.1.104 手机连上同个路由器,输入192.168.1.104,得到(下图为示意图,IP地址更换即可) 这就是handleMain中返回给浏览...

Arduino库函数中文说明

#define 常量名 常量值% 取模运算符String abc/char abc[n]定义字符串pinMode(pin,mode);用于引脚的初始化mode包括 INPUT/OUTPUT/INPUT_PULLUPArduino 数模转换器有 10位精度,可以将0-5V转换为 0-1023,仅用于analogRead(pin) analogWrite(n)...

Arduino学习笔记 (四) -- 常用函数

1、pinMode(pin,Mode):设置引脚的输入输出状态        Pin:引脚号;        Mode:INPUT、OUTPUT 2、digitalWrite(pin,value) :设置输出引脚的高低电平状态        Pin:引脚号 ;        value:HIGH LOW 3、int digitalRead(pin):读取引...

Arduino 101/Genuino101使用-第2篇

1. Arduino 101编程只是在ARC的核心上进行,其具体架构为ARCv2EM。、 2. 而Quark核心,从目前可知的信息来看,其应该运行着名为Zephyr的RTOS 3.101并没有EEPROM存储单元,其提供的EEPROM库,实际上是在操纵其上的Flash空间。 4. 跑个定时器例程测试一下 1 #include "CurieTimerOne....

「雕爷学编程」Arduino动手做(29)——DS1302时钟模块

37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。 【Arduino】108种传感器模块系列实验(资料+代...

Arduino与xbee模块点灯实验心得

1.硬件:Seeeduino Stalker v3.0俩块,xbeeS1俩块,led一个,导线,电源,面包板    软件:XCTU,Arduino1.8.2 2.xbee模块配置:恢复出场设置后        主机xbee的    DH:1234,MY:5678        从机xbee的    DH:5678,  MY:1234 (API为disabl...