上一页 1 ··· 3 4 5 6 7 8 9 下一页

2014年1月7日

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)

2014年1月5日

Chap-4 Section 4.2.4 指令修正方式

摘要: 对于X86平台下的ELF文件的重定位入口所修正的指令寻址方式只有两种:绝对近址32寻址和相对近址32寻址。这两种指令修正方式每个被修正的位置的长度都为32位,即4个字节,而且都是近址寻址,不用考虑Intel的段间远址寻址。r_info成员的低8位表示重定位入口的类型。X86基本重定位类型宏定义 值 重定位修正方法R_386_32 1 绝对寻址修正 S + AR_386_PC32 2 相对寻址修正 S + A - PA = 保存在指令中被修正位置的值P = 被修正的位置(相对于段开始的偏移量或者虚拟地址),该值可以通过r_offset... 阅读全文

posted @ 2014-01-05 01:01 Persistence 阅读(851) 评论(0) 推荐(0)

Chap-4 Section 4.2.3 符号解析

摘要: 4.2.3 符号解析在平时的编程过程中,之所以要进行链接是因为我们目标文件中用到的符号被定义在其他文件中,所以要将它们链接起来。例如,直接用ld来链接a.o,而不将b.o做为输入,链接器就会发现shared和swap这两个符号没有被定义,会出现下面如图4.2.6的错误:***图4.2.6***上图所示的错误也是我们平时编程过程中遇到的常见问题之一,就是链接符号未定义。导致这个问题的原因很多,最常见的一般都是链接时缺少某个库,或者输入目标文件路径不正确,或者符号的定义和生命不一样。通过上面的介绍,可以深层次的理解为什么缺少符号的定义会导致链接错误,其实重定位的过程也伴随着符号解析的过程,每个目标 阅读全文

posted @ 2014-01-05 00:56 Persistence 阅读(220) 评论(0) 推荐(0)

Chap-4 Section 4.2.2 重定位表

摘要: 4.2.2 重定位表链接器怎么知道那些指令是要被调整?而这些指令的中那些部分需要被调整?记得在ELF文件中有一个重定位表,专门保存这些与重定位相关的信息,重定位表往往是一个或者多个重定位段。对于每个要被重定位的段在ELF中都会有一个对应的重定位段。比如代码段“.text”有要被重定位的地方,那么会有一个相对应的“.rel.text”段保存代码段中的重定位表。可以用objdump -r a.o来查看ELF文件的重定位表。如图4.2.4所示:***图4.2.4***上图显示了目标文件a.o中所引用到的外部符号的地址。每个要被重定位的地方叫重定位入口(Relocation Entry),可以看到a. 阅读全文

posted @ 2014-01-05 00:54 Persistence 阅读(471) 评论(0) 推荐(0)

2014年1月2日

Chap-4 Section 4.2 符号解析和重定位

摘要: 在完成空间和地址的分配步骤后,链接器进入了符号解析与重定位的步骤,这也是静态链接的核心内容。首先看一下目标文件a.o中怎么使用两个外部符号shared和swap的。用objdump -d a.o查看反汇编后的结果,如图4.2.1:***图4.2.1***可以很清楚的看到a.o的反汇编结果中,a.o共定义了一个函数main,这个函数占用0x2b个字节,共12条指令,最左边那列是每条指令的偏移量,每行代表一条指令,有的指令很长,例如偏移量为0x09和0x11的两条指令,对于变量shared引用的是偏移为0x11的movl指令,这条指令共计8个字节,作用是将shared的地址赋值给esp寄存器+4的 阅读全文

posted @ 2014-01-02 23:47 Persistence 阅读(543) 评论(0) 推荐(0)

Chap-4 Section 4.1 静态链接介绍

摘要: 当我们又两个目标文件时,如何将他们链接起来形成一个可执行文件?这个过程发生了什么?这基本上就是链接的核心:静态链接。在本章中,将会用一下两个源文件a.c和b.c做为例子说明://a.cextern int shared;int main() { int a = 100; swap(&a, &shared); return 0;}//b.cint shared = 1;void swap(int* a, int* b) { *a ^= *b ^= *a ^= *b;}4.1 空间与地址分配对于多个输入目标文件,链接器如何将它们的各个段合并到输出文件?或者说,输出文件中的空间如何分 阅读全文

posted @ 2014-01-02 23:44 Persistence 阅读(252) 评论(0) 推荐(0)

Chap-3 Section 3.6 符号修饰和函数签名

摘要: C++符号修饰C++拥有类、继承、虚机制、重载、名称空间这些特性,使得符号管理更加复杂。例如:针对如下两个函数fun(int)和fun(double),函数名字相同,但是参数不同,这是C++里面函数重载的最简单的一种情况,那么编译器和链接器在链接过程中是怎样区分这两个函数呢?为此,C++引入了符号修饰(Name Decoration)和符号改编(Name Mangling)。比如有如下代码://nameDe.cint func(int);float func(float);class C { int func(int); class C2 { int func(int); };};names. 阅读全文

posted @ 2014-01-02 23:41 Persistence 阅读(224) 评论(0) 推荐(0)

Chap-3 Section 3.5 弱符号与强符号

摘要: 链接器解析符号的方法是将每个引用与它输入的可重定位目标文件的符号表中的一个确定的符号定义联系起来。对那些和引用定义在相同模块中的本地符号引用,符号解析很直接。编译器只允许每个模块中每个本地符号只有一个定义。不过对于全局符号的引用就稍微麻烦一些,当编译器遇到一个不是在当前模块中定义的符号(变量或者函数名)时,它会假设该符号是在其他某个模块中定义的,生成一个链接器符号表条目,并把它交给链接器处理。如果链接器在它的任何输入模块 中找不到这个被引用的符号,它就输出一条错误信息并且终止。 在编译时,编译器向汇编器输出每个全局符号,或者是强(strong)或者是弱(weak),而汇编器把这个信息隐含地编码 阅读全文

posted @ 2014-01-02 23:39 Persistence 阅读(274) 评论(0) 推荐(0)

Chap-3 Section 3.5 ELF符号表结构

摘要: ELF文件中的符号表往往是文件中的一个段,段名叫".strtab"。符号表的结构是由Elf32_Sym结构体构成的数组,每个Elf32_Sym结构对应一个符号。数组的第一个元素,也就是下标为0的元素为无效的“未定义”符号。typedef struct { Elf32_Word st_name; //该符号名在字符串表中的下标。 Elf32_Addr st_value; //符号相对应的值。 Elf32_Word st_size; //符号大小。对于包含数据的符号,这个值是该数据类型的大小 unsigned char st_info; //符号类型和绑定信息。 u... 阅读全文

posted @ 2014-01-02 23:36 Persistence 阅读(612) 评论(0) 推荐(0)

Chap-3 Section 3.4 段表

摘要: ELF文件中又各式各样的段,段表(Section Header Table)就是保存这些段的基本属性的结构。段表是ELF文件中除了文件头之外最重要的结构,它描述了ELF的各个段的信息,比如每个段的段名、段的长度、在文件中的偏移、读写权限以及段的其他属性。可以用readelf -S *.o来查看可执行文件中的各个段,段表的结构比较简单,它是以“Elf32_Shdr”结构体为元素的数组,数组元素的个数等于段的个数,每个“Elf32_Shdr”结构体对应一个段,该结构体又称为段描述符(Section Descriptor).ELF段表的这个数组第一个元素是无效的段描述符,它的类型为NULL.ELF_ 阅读全文

posted @ 2014-01-02 23:34 Persistence 阅读(228) 评论(0) 推荐(0)

Chap-3 Section 3.3 ELF文件头

摘要: ELF目标文件格式的最前部是ELF文件头(ELF Header),它包含了描述整个文件的基本属性,比如ELF文件版本、目标机器类型、程序入口地址等,紧接着是ELF文件各个段。ELF文件中与段最有关的数据结构就是段表(Section Header Table),该表描述了ELF文件包含的所有段的信息,比如每个段的段名、段的长度、在文件中的偏移、读写权限以及段的其他属性。3.2.1 ELF文件头 ELF文件头定义了ELF魔数、文件机器字节长度、数据存储方式、版本、运行平台、ABI版本、ELF重定位类型、硬件平台、硬件平台版本、入口地址、程序头入口和长度、段表的位置和长度、段的数量等。 ELF文件. 阅读全文

posted @ 2014-01-02 23:33 Persistence 阅读(348) 评论(0) 推荐(0)

Chap-3 Section 3.2 ELF文件结构描述

摘要: ELF目标文件格式的最前部是ELF文件头(ELF Header),它包含了描述整个文件的基本属性,比如ELF文件版本、目标机器类型、程序入口地址等,紧接着是ELF文件各个段。ELF文件中与段最有关的数据结构就是段表(Section Header Table),该表描述了ELF文件包含的所有段的信息,比如每个段的段名、段的长度、在文件中的偏移、读写权限以及段的其他属性。 阅读全文

posted @ 2014-01-02 23:31 Persistence 阅读(214) 评论(0) 推荐(0)

Chap-3 Section 3.1 目标文件格式

摘要: 现在PC平台流行的可执行文件格式(Executable)主要是Windows下的PE(Portable Executable)和Linux下的ELF(Executable Linkable Format),它们都是COFF(Common File Format)格式的变种。目标文件就是源代码编译后但未进行链接的那些中间文件(Windows下的.obj和Linux下的.o文件),它跟可执行文件的格式很相似,因此一般跟可执行文件一起采用一个格式存储。不光是可执行文件(Windows下的.exe和Linux下的ELF可执行文件)按照可执行文件格式存储。动态链接库(Windows下的.dll和Linu 阅读全文

posted @ 2014-01-02 23:30 Persistence 阅读(190) 评论(0) 推荐(0)

2013年12月31日

Linux编译安装Qt

摘要: 1. 阅读全文

posted @ 2013-12-31 03:45 Persistence 阅读(160) 评论(0) 推荐(0)

上一页 1 ··· 3 4 5 6 7 8 9 下一页

导航