从品牌网站建设到网络营销策划,从策略到执行的一站式服务
原文连接:http://blog.gotocoding.com/archives/875
今天有同学提出,如何在一个C程序中让两个不同版本的库共存。
首先想到的方案是,把其中一个版本的库函数全部重命名,比如把每一个函数名都加一个_v2的后缀。
人工替换到没什么,但是如果函数个数超过10个,就有点不拿人当人使了。
而使有工具去替换就会遇到一些棘手的问题,如何识别哪些是函数,哪些是系统函数(系统函数不需要添加后缀)等。
随后想到的另一个解决方案是C++的方案,为其中一个版本库中的所有文件添加命名空间。然后使用g++将这部分代码编译成.o文件,之后再使用gcc将这些.o文件与整个程序中的其他代码进行链接。
不过需要注意的是,g++编译后所有导出接口名都会变化得不那么直观。
第三种方案完全解决了以上两种方案的痛点。
考虑一个C语言的编译链接过程。
首先会将每个c文件编译成.o文件。
在编译过程中,导出函数并不会被实际分配地址,而是将函数名以F符号的方式存在.o文件的符号表中。
在本c文件调用的函数如果不存在于本文件,也会生成一个UND的符号存在.o文件的符号表中。
在链接过程中,链接器接收输入的.o文件,为每个.o文件中的符号分存地址,并生成可执行文件。
有了这几点事实,问题就变得的简单多了。
首先将其中一个版本的库中所有代码编译为.o文件。然后收集所有.o文件中的F符号。
由于整个库代码有内部依赖关系,收集到的F符号必然是所有.o文件中UND符号的超集。
换句话说,所有的F符号名就是我们要重命名的所有函数名。
这里我们需要借助objdump和objcopy工具。objdump -t 用于列表.o文件的符号表,objcopy用于重命名符号。
我随手写了一段用于过虑F符号的lua脚本
1 另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。 网页题目:C程序中让两个不同版本的库共存-创新互联 标题URL:http://cdkjz.cn/article/egjhi.html 相关资讯
多年建站经验
成都网站建设公司地址:成都市青羊区太升南路288号锦天国际A座10层 建设咨询028-86922220 成都快上网科技有限公司-四川网站建设设计公司 | 蜀ICP备19037934号 Copyright 2020,ALL Rights Reserved cdkjz.cn | 成都网站建设 | © Copyright 2020版权所有. 专家团队为您提供成都网站建设,成都网站设计,成都品牌网站设计,成都营销型网站制作等服务,成都建网站就找快上网! | 成都网站建设哪家好? | 网站建设地图 |