注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Allen小笔记

有时会忘记努力...

 
 
 

日志

 
 

C++与ABI  

2010-03-30 17:37:23|  分类: C/C++ |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
                                                                         keywords: C++     ABI    link

   在说ABI之前,我要先说说链接(link).
   链接的本质就是把不同的object文件(目标文件)粘合到一个可执行文件,可以说有点像是搭积木或玩拼图。为了能使link成功,通常来说需要一套规则,而这个规则简单的说就是符号(Symbol)裁决,通常靠object文件中的Symbol Table来完成管理(这个规则是可以写一本书的量,我也不太懂)。那么什么是符号呢?在链接阶段,通常我们把函数和变量统称为符号(Symbol)。这是一个二元值,即(Symbol name, Symbol value),而这又分别对应到(函数名,函数地址)或者是(变量名,变量地址)。
   在20世纪70年代以前,编译器编译源代码产生目标文件时,符号名与相对应的函数名或者变量名是一样的。但是随着时间的推移,越来越多的库出现,这样的话符号相同的情况就越来越多,也就是符号冲突日益严重。为了防止符号名冲突,Unix下的C就规定,C语言源代码文件中的所有全局变量和函数名经过编译后,相对应的符号名前面加上下划线“_”。这种简单而原始的处理方法还是能应付小规模的开发的,但是大规模的团队如果命名不规范仍然会出现问题。
所以,像C++这样后来设计的语言,增加了namespace的方法来解决某块之前的符号冲突。
  C++除了namespace,还有override,overload,inherit,template....等等特性,这些都个符号管理增加了复杂度。C++的符号修饰的规则还和编译器相关,目前分成两个大派别,GCC和Virtual C++.有兴趣的请自己google.
  所以,大家知道了C和C++相互调用时候为什么会出现extern "C"{........}了吧?extern "C"{........}告诉编译器采用C的符号规则,这样大家都统一了!
   在说ABI之前仍然还要谈谈API.所谓API是指:Application Programming Interface。这是偏向源代码级别的接口,比如POSIX就是这样一个API标准。而ABI是指:Application Binary Interface。这是偏向二进制级别的接口,兼容程度比API更为严格。上面我们谈到的符号就是ABI中的一部分。除此之外还包含有C++对象的内存分布,函数调用方式,template如何实例化,异常的产生和捕获,内嵌函数的访问细节.....
   本来大家都希望ABI能统一的,这样的话,移植就可以轻松很多,然后不幸的是:仅符号管理我们就可以看出GNU和Microsoft就有很大的不同,而且即使是Microsoft的不同版本的编译器也可能有不一样的行为。所以C++一直被人诟病的原因之一,就是ABI的兼容性不好。
  评论这张
 
阅读(1607)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017