关于对象文件在进行连接时的一些思考
2013-10-12 13:01
141 查看
实例程序如下:
// a.c
// 编译指令:cl /c a.c ----> a.obj
int a;
// b.c
extern int a;
int main()
{
int b = a;
}
文件 b.c 编译后生成 b.obj 文件 ,extern 关键字表明整型变量(int) e 来自于外部的 .obj 文件或者.lib文件,所以为了正确得到该变量,在 a.obj 文件中必然有一些引用信息,可以在其他文件中正确得到 .obj 文件。
以上为 b.obj 的汇编代码注意其中的符号 _e ,在对象文件 b.obj 文件进行连接时就是要根据符号 _e进行查找和定位,从而得到e的值。
b.obj文件的汇编代码:
其中产生了符号 _e 所以在连接时a.obj才能正确找到e的值。正确连接后,变量e被分配到数据段,使用b.obj文件中的值进行正确的赋值,此时,变量e就有了确切的地址,符号_e自然就没有用了,所以连接(link a.obj b.obj)后生成的a.exe中就没有了符号_e.
变量(e)的修饰名称(_e),是与编译器设置相关的(和语言相关的),倘若变量e声明在a.c文件中,在某个.cpp文件中如若使用到e,则应该使用extern "C" int e来进行说明,这样其生产的obj文件对e的名称修饰就是_e,而不是C++语言的修饰规则。
// a.c
// 编译指令:cl /c a.c ----> a.obj
int a;
// b.c
extern int a;
int main()
{
int b = a;
}
文件 b.c 编译后生成 b.obj 文件 ,extern 关键字表明整型变量(int) e 来自于外部的 .obj 文件或者.lib文件,所以为了正确得到该变量,在 a.obj 文件中必然有一些引用信息,可以在其他文件中正确得到 .obj 文件。
以上为 b.obj 的汇编代码注意其中的符号 _e ,在对象文件 b.obj 文件进行连接时就是要根据符号 _e进行查找和定位,从而得到e的值。
b.obj文件的汇编代码:
其中产生了符号 _e 所以在连接时a.obj才能正确找到e的值。正确连接后,变量e被分配到数据段,使用b.obj文件中的值进行正确的赋值,此时,变量e就有了确切的地址,符号_e自然就没有用了,所以连接(link a.obj b.obj)后生成的a.exe中就没有了符号_e.
变量(e)的修饰名称(_e),是与编译器设置相关的(和语言相关的),倘若变量e声明在a.c文件中,在某个.cpp文件中如若使用到e,则应该使用extern "C" int e来进行说明,这样其生产的obj文件对e的名称修饰就是_e,而不是C++语言的修饰规则。
相关文章推荐
- 关于对象文件在进行连接时的一些思考
- 个人关于存储不同类型对象进行碰撞检测的一些思路
- 关于sessions.ser文件的一些思考
- 1.关于UltraEdit中的FTP和Tenent配置,UE远程连接Linux进行文件操作
- 关于as3实现对任何对象进行深刻复制的思考
- 关于DBCP为什么加载了配置文件 直接一个getConnection就获得了连接对象呢 ?
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- 关于使用AE进行图层与oracle外表连接制作专题图的一些问题
- 关于产品设计的一些思考——小米2自带文件管理
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- 【Android】导入第三方库时,关于so文件的一些思考
- 1.关于UltraEdit中的FTP和Tenent配置,UE远程连接Linux进行文件操作
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- 【Android】导入第三方库时,关于so文件的一些思考
- 关于PHP程序使用file_get_content()函数进行抓取PHP程序与smarty结合编译过程中产生的静态文件,抓取不了?连接超时?(地址映射)
- 关于对象之间通信的一点思考
- ABAP--ABAP语言对象编程的一些样例代码连接收集
- 关于 库文件的一些认识
- 关于Java解压文件的一些坑及经验分享(MALFORMED异常)
- Hard links and Soft links(转 精典的关于软,硬连接文件的解释)