eCos系统无法正确链接到在C++源文件中自定义的cyg_user_start函数的问题和解决办法

在C++源文件中定义cyg_user_start函数前,将其声明成C函数,即可解决问题。

eCos官网:http://ecos.sourceware.org

eCos中文技术网:http://www.52ecos.net

eCos交流QQ群:144940146。

http://blog.csdn.net/zoomdy/article/details/39396085

mingdu.zheng<at>gmail<dot>com

问题:

在C++源文件中定义cyg_user_start,按照预期最终编译出来的eCos应用在系统初始化后进入该函数,实际运行结果不是。通过调试发现总是进入eCos系统位于infra/<versin>/src/userstart.cxx的默认的cyg_user_start函数。

解决:

在定义cyg_user_start函数前,将其声明成C函数。

#include <cyg/infra/cyg_type.h>
externC void cyg_user_start( void ); // 声明成C函数
void cyg_user_start(void)
{
……
}

解释:

C++由于需要支持函数重载,因此C++编译器会对函数名进行名称转换,在C++中void cyg_user_start(void)的最终符号名为_Z14cyg_user_startv,而链接器是只认识符号名的,对于连接器而言_Z14cyg_user_startv和cyg_user_start是两个不同的函数,因此不能正确链接到自定义的cyg_user_start函数,使用externC(cyg_type.h中定义的宏,在C++中展开为extern "C")将cyg_user_start函数声明为C函数,C++编译器不会对声明为C函数的函数进行名称转换,void
cyg_user_start(void)的最终符号名依然为cyg_user_start。使用nm查看生成的.o文件可以查看符号表,通过查看符号表可以发现这个问题。

时间: 2024-11-03 22:33:23

eCos系统无法正确链接到在C++源文件中自定义的cyg_user_start函数的问题和解决办法的相关文章

eCos系统无法正确链接到在C++源文件里自己定义的cyg_user_start函数的问题和解决的方法

在C++源文件里定义cyg_user_start函数前,将其声明成C函数.就可以解决这个问题. eCos官网:http://ecos.sourceware.org eCos中文技术网:http://www.52ecos.net eCos交流QQ群:144940146. http://blog.csdn.net/zoomdy/article/details/39396085 mingdu.zheng<at>gmail<dot>com 问题: 在C++源文件里定义cyg_user_st

面试官系统精讲Java源码及大厂真题系列之Java线程安全的解决办法

1. 背景 1.1 static修饰类变量.方法.方法块.  public + static = 该变量任何类都可以直接访问,而且无需初始化类,直接使用 类名.static 变量 1.2 多个线程同时对共享变量进行读写时,很有可能会出现并发问题.(存在共享数据时才需要考虑线程安全) 1.3 public static List<String> list = new ArrayList(); 这个 list 如果同时被多个线程访问的话,就有线程安全的问题. 2. 解决方法 2.1特定策略解决线程

SQL SERVER 2012/2014 链接到 SQL SERVER 2000的各种坑

本文总结一下SQL SERVER 2012/2014链接到SQL SERVER 2000的各种坑,都是在实际应用中遇到的疑难杂症.可能会有人说怎么还在用SQL SERVER 2000,为什么不升级呢? 每个公司都会有一两个几乎快被人遗忘的系统,接手维护这些系统的人可能都不知换了多少批了.它们的命运注定慢慢消亡.然而偏偏却又生命力顽强,总还有一些人在使用着这些系统.所以就处在一种尴尬的境地: 升级吧,价值不大,可能再过一两年,这系统就要被其它系统替代了.而且项目经理也没有精力.人手耗费在这上面.最

Cygwin环境使用第三方ARMGCC编译eCos系统

第三方ARMGCC通常是基于Mingw32的,使用的是Windows路径,如C:\ecos\packages\infra\current\src\startup.cxx:而eCos配置工具生成的Makefile是基于Cygwin的,使用的是POSIX路径,如/cygdrive/c/packages/infra/current/src/startup.cxx.路径格式上的差别导致不能直接使用第三方ARMGCC编译eCos系统,而是需要一个中间程序来对路径进行转换.这里提供了执行路径转换的中间程序的

基于区块链的支付系统开发,区块链支付方案

基于区块链的支付系统开发,区块链支付方案区块链支付系统开发,区块链支付平台让用户轻松注册:每个人都知道,开一个新的账户或者买一张新的信.用.卡就意味着你需要花费大量的文书工作来完成冗长乏味的过程.而如果你使用数字资产区块链支付平台,你几乎肯定会立即这样做.此外,它就像应下载用程序到您手机一样简单. 区块链技术的去中心化特征正在"抢目前电商平台第三方支付平台的饭碗",以区块链为基础的新型互联网金融体系,买方和卖方可以直接交易,交易基于密码学原理而不基于信任,使得任何达成一致的双方,能够直

WMware 10 上安装Mac OS X 10.9 系统的正确方法

最近需要在iPad上做一个App,于是想在虚拟机中安装一个OS X 10.9试用一下.经过几十次的尝试趟过很多坑后,终于找到了在WMware 10 上安装Mac OS X 10.9 系统的正确方法.本方法不需要什么U盘,而且由于所有操作都在硬盘上,所以速度也会很快. 需要准备的工具和文件如下: VMware-workstation-full-10.0.1-1379776.exe unlock-all-v130.zip Install OS X Mavericks.dmg(大小为 4.94G) U

使用Powershell链接到Office 365

今天主要讲使用Powershell管理Office 365 可以分为office365用户管理,Exchange Online的管理等 1. 使用Powershell 链接到office 365 用户管理界面 需要先安装登陆助手及Azure AD模块 在windows powershell 下运行: Get-ExecutionPolicySet-ExecutionPolicy RemoteSigned //更改执行策略,执行一次就够了$credential = Get-Credential  

输入正确密码但是无法登录系统的解决办法ubuntu14.04

输入正确密码但是无法登录系统的解决办法: Ctrl+shift+Fn+F1,进入tty1,然后再login哪里输入自己的用户名,例如我的输入yxg,然后就是输入密码,这时候正确的话就登入了自己用户名的系统中: 找到上次我添加进去的root用户的文件,然后将其删除: Ctrl+shift+Fn+F7,就进入的是图形界面的窗口,输入正确的密码登入即可. 这里看似很简单的一个过程,但是耗费较长的时间,主要是由于搜索的文件解决方式是不一样的,典型的方式为:http://www.programgo.com

Windows系统下正确安装MongoDB

1.下载.安装 官网下载: http://www.mongodb.org/downloads 下载好之后,接下来进行安装了: 2.创建数据文件夹 MongoDB将数据文件夹存储在 db 文件夹下. 可是这个数据文件夹不会主动创建,我们在安装完毕后须要创建它.请注意.数据文件夹应该放在根文件夹下((如: C:\ 或者 D:\ 等 ). 在本教程中.我们已经在C:盘 安装了 mongodb,如今让我们创建一个data的文件夹然后在data文件夹里创建db文件夹. c:>cd c:\ c:>mkdi