摘要: 链接器和加载器,以及编译器和汇编器与体系结构的细节密切相关,这包括硬件体系结构和操作系统对目标计算机在体系结构方面的约定。硬件体系结构的两个方面影响到连接器:程序寻址和指令格式。应用程序二进制接口ABI包含了应用程序在这个系统下运行时必须遵守的编程约定,ABI包含一系列的系统调用和使用这些系统调用的方法,以及可以使用的内存地址和使用机器寄存器的规定。ABI要求每个程序包含一个该程序各例程使用的所有静态数据的地址表。内存地址直接顺序和对齐,大端小端,无须争论,小端指低位在低字节,对齐是必须的。过程调用和可寻址性对于局部和全局静态数据,编译器可以为一个例程引用的所有静态变量创建一个指针表。如果某个 阅读全文
posted @ 2013-08-27 23:46 李可以 阅读(204) 评论(0) 推荐(0) 编辑
摘要: 链接器和加载器做什么?任何一个链接器和加载器的基本工作都非常简单:将更抽象的名字与更低层的名字绑定起来,好让程序员使用更抽象的名字编写代码。地址绑定:从历史的角度编译时绑定链接时绑定加载时绑定运行时绑定都是为了节省代码。虚拟内存的出现,使分段出现?动态链接库的出现。链接器与加载器完成几个相关但概念上不同的动作。程序加载:将程序从辅助存储设备拷贝到主内存中准备运行。分配存储空间,设置保护位,或通过虚拟内存将虚拟地址映射到磁盘内存页上。重定位:汇编器为每个文件创建程序地址从0开始的目标代码,但是实际情况是会被加载到不同的地址,调整程序中的数据和代码以反映所分配地址的过程。 典型的过程是:多个子程序 阅读全文
posted @ 2013-08-27 21:23 李可以 阅读(385) 评论(0) 推荐(0) 编辑
摘要: 本章是从__链接和加载__这一章扣出来的。(好,暂停,在这里我要说一说我的想法,进程当然有基地址,然后硬件会给每个加载进内存的程序的代码和数据的地址进行调整。这样便支持了运行时绑定。可以注意到,出了动态链接库或者说共享库,程序代码不许要保留其他符号,保留的符号必然是DLL或这.a文件里的。而这样的文件正是链接程序生成的,链接程序为了生成这样的程序需要付出什么代价呢?每一个目标文件有基地址,代码段和数据段所有使用内存地址是num+pbase的格式。对一个目标文件而言pbase为0,num也肯定都为正。符号表仍然保留,是为了那些共享库。(头痛,其实还有外部引用问题。)多个目标文件链接时,将记录基地 阅读全文
posted @ 2013-08-27 15:42 李可以 阅读(478) 评论(0) 推荐(0) 编辑
摘要: 有一个假想的对话如下。主:你想制作出一群能相互协作的纳米机器人?客:是的,我想把它们当作病毒杀手,并且构建人类的防御系统。主:有什么困难?客:困难在于识别,单个机器人不可能具有识别哪一个细胞(广义)是病毒还是正常的细胞,或者正常的细菌。主:为什么呢?客:单个机器人不应当携带太多的bit位,它无法运行一个操作系统,而是机器人协作来构成一个操作系统,如同一群鱼群。主:病毒之间有通信吗?客:我不知道,但是细菌绝对有。主:你看,以乙肝病毒举例,乙肝病毒之间并不需要相互通信,它们仅仅是入侵肝细胞,然后不停的复制。客:你的意识是不需要群体协作,只需要制作出一种特殊目的,针对特殊病毒的纳米机器人?主:对。客 阅读全文
posted @ 2013-08-27 11:51 李可以 阅读(333) 评论(0) 推荐(0) 编辑