摘要:定义一个字符数组 char a[9] = "abcdefgh"现在取c = a[i]编译器符号表中有一个地址9980运行时步骤一:取i的值,将它和9980相加运行时步骤二:取出地址(9980+i)处的内容如果定义char *p = "abcdefgh"取c = p[i]编译器符号表中p的地址为4624运行时步骤一:取出地址4624的内容为5081运行时步骤二:计算5081+i,得到新地址运行时步骤三:取出地址(5081+i)处的内容所以假如在文件一种定义char a[9] = "abcdefgh"而在文件二中声明extern char 阅读全文
对链接的认识续篇
2013-08-22 21:28 by zhanjl, 144 阅读, 0 推荐, 收藏,
摘要:上篇文章完整的介绍了静态链接的过程,其实,链接的整个过程也大致如此。下面说一下动态链接和静态链接的不同之处。既然静态链接能很好的完成任务,为什么会出现动态链接呢?静态链接的哪些问题促使了动态链接的出现?静态链接有两个主要问题,一浪费资源,我们知道,几乎每个C程序都会使用标注I/O函数,例如printf,scanf等等,静态链接会把这些函数复制到可执行文件中。所以运行时,每一个使用这些函数的进程中都有这些函数的副本,在一个运行50-100个进程的典型系统上,这是对存储资源的极大浪费。另一个问题是如果要更新静态库的话,那么要重新链接每一个之前使用该库的文件,会很麻烦。共享库很好的解决了上述问题,我 阅读全文
对链接的认识
2013-08-21 19:47 by zhanjl, 284 阅读, 0 推荐, 收藏,
摘要:之前对链接过程一直都很模糊,总感觉很神秘,这两天看了一些有关链接的资料,对链接过程有了一个大概的认识,写这篇博客的目的是想整理一下自己的思路,如果有不对的地方,欢迎指导。我们知道源文件经过预处理器、编译器、汇编器会生成一个可重定位目标文件,链接器的作用就是把多个可重定位目标文件以及一些必要的系统目标文件组合起来,创建一个可执行目标文件。本文以下面两个源文件为例子,来说明链接的过程/*main.c*/void swap();int buf[2] = {1,2};int main(){ swap(); return 0;}/*swap.c*/extern int buf[];int... 阅读全文
浙公网安备 33010602011771号