2014年1月7日

Chap-4 Section 4.6 链接控制过程

摘要: 4.6 链接过程控制前面我们在使用ld链接器的时候,没有指定链接控制脚本,其实ld在用户没有指定链接脚本的时候会使用默认链接脚本,可以使用ld -verbose来查看ld默认的链接脚本。当然,为了更加精确的控制链接过程,可以自己写一个链接控制脚本,然后指定该脚本为链接控制脚本,可以使用-T参数:ld -T link.script4.6.2 最小的程序为了演示链接的控制过程,我们要写一个程序,该程序的功能是在终端输出"hello world"。但是我们这里的程序与C语言教科书中的例子有所不同。首先,经典的hello world使用了printf函数,该函数是C语言库的一部分, 阅读全文

posted @ 2014-01-07 00:19 Persistence 阅读(397) 评论(0) 推荐(0)

Chap-4 Section 4.5 静态库链接

摘要: 4.5 静态库链接一个静态库可以看成是是一组目标文件的集合,即很多目标文件经过压缩打包后形成的一个文件。比如我们在Linux中最长使用的C语言静态库libc位于/usr/lib/i386-linux-gnu目录下,它属于glibc项目的一部分。glibc本身是用C语言开发的,它由成千上百个C语言源代码文件组成,编译完成后有相同数量的目标文件,比如输入输出printf.o,scanf.o;文件操作有fread.o,fwrite.o;时间日期有date.o,time.o;内存管理有malloc.o,把这些零散的目标文件直接提供给库的使用者,很大程度上会造成文件传输、管理和组织方面的不便,于是使用a 阅读全文

posted @ 2014-01-07 00:16 Persistence 阅读(269) 评论(0) 推荐(0)

Chap-4 Section 4.4 C++相关问题

摘要: 4.4 C++相关问题C++的一些语言特性使之必须由编译器和链接器共同支持才能完成工作,最主要的又两个方面,一个是C++的重复代码消除,另外一个是全局的构造和析构。另外由于C++语言的各种特性,比如虚函数、函数重载、继承、异常机制等,使得背后的数据结构异常复杂,这些数据结构往往在不同的编译器和链接器之间相互不能通用,使得C++程序的二进制兼容性成了一个大问题。4.4.1 重复代码消除4.4.2 全局构造和析构我们知道一般的C++/C程序是从main函数开始执行的,随着main函数的结束而结束。然而,其实在main函数被调用之前,为了程序能够顺利执行,先要初始化进程的执行环境,比如堆分配初始化、 阅读全文

posted @ 2014-01-07 00:14 Persistence 阅读(225) 评论(0) 推荐(0)

Chap-4 Section 4.3 COMMON块

摘要: 4.3 COMMON块如果一个弱符号定义在多个目标文件中,而它们的类型又不同,怎么办?目前的链接器类型并不支持符号的类型,即变量类型对于链接器而言是透明的,它只知道一个名字,并不知道类型是否一致,那么当我们定义的多个符号类型不一致时,链接器该怎么处理呢?主要分三种情况:1.两个或者两个以上的强符号类型不一致2.有一个强符号,其他都是弱符号,出现类型不一致3.两个或者两个以上弱符号类型不一致对于第一种情况而言,定义多个强符号本身就是违法的,链接器会报符号多重定义错误,链接器处理的就是后两种情况。事实上,现在的编译器和链接器都支持一种叫COMMON块的机制,该机制最早来源于Fortan,早期的Fo 阅读全文

posted @ 2014-01-07 00:12 Persistence 阅读(410) 评论(0) 推荐(0)

导航