和动态库加载时在可施行文件,代码和数据放在合适的内存位置操作系统按照法式头的消息把,能够一般运转然后法式才。
如例,是一个数组符号表就,(函数或全局变量)每一项就是一个符号,都是固定的每项的大小,一项sh_entsize它们的“节头”里就有这。
是很主要的这一项也,每个节的名字是什么通过它才能够晓得,个节是做什么的才能够晓得每。
串的索引节名字符,(所有节里的)哪个节它暗示节名字符串是,是最初一个节一般环境下。
nux上在Li,标文件(.o文件)不管是编译完的目,的可施行文件仍是毗连后,lf格局都是e。
改了e_entry若是有电脑病毒修,系统先运转病毒代码了就能够让linux。
data在哪里例如数据段.,ext在哪里代码段.t,应的“节头”都要查看对。
不是一样的这两个地址,一般还有对齐要求并且内存里的地址,不需要对齐但文件里。
的感化法式头,统把数据段加载到哪里就是告诉Linux系,加载到哪里把代码段,准确地读写数据让代码能够 。
据区数,、重定位消息、调试消息等无效数据是法式真正的代码、数据、符号表。
F文件的类型指的是EL,ET_EXE、动态库ET_DYN三种包罗方针文件ET_REL、可施行文件。
在毗连时确定的这个内存位置是,同样的内存镜像才能够在加载时也必需连结,晓得赋值到哪里去了不然这个10就不。
接给出节名之所以不直,存放在一个持续的区域是为了把字符串集中,省空间以节。
的入口地址指的是法式,法式加载到内存之后Linux系统把,个地址运转就跳转到这,ain()函数然后才会挪用m。
文件的识别码它是ELF,字符来判断是不是ELF文件的Linux系统就是靠这几个。
码、数据、符号表、或调试消息每个“节”的内容都是法式的代,放位置就是通过节头办理的它们在ELF文件里的存。
”的名字暗示“节,)字符串表里的偏移量但它只是给出在(节名,以0结尾的字符串是,到真正的名字如许才能够找。
F文件EL,雷同windows上的exe文件)是Linux系统上的可施行文件(。
如例,函数或全局变量的地址重定位节重定位的是,的消息又在符号表里而函数或全局变量,要联系关系到符号表所以重定位节:
的符号表是哪一个“节”如许就能够晓得它重定位,就写在这两项里这个节的索引号。
序头程,施行文件和动态库时利用的是Linux系统加载可,里没有法式头在方针文件。
并不克不及间接运转刚编译完的文件,量的地址都不是实在地址由于里面的函数、全局变,利用的重定位消息而只是给毗连器。
全局变量a例若有个,a = 10代码里有一行,道它精确的内存位置要给a赋值必需知。
的PLT表和GOT表当法式动态毗连时需要,一个节也是。加载到内存它们也需要,载器会点窜GOT表而且Linux的加,库里的函数地址让它指向动态。
也是“节”的一种代码段、数据段,加载到内存它们都需要,、施行的权限分歧区别只是读、写。
据在文件里的地址(sh_offset)每个节的数据现实上有2个地址:一个是数,的地址(sh_addr)一个是数据要加载到内存里。
、毗连器代码、gdb调试消息的实现scf编译器框架的ELF文件格局,/elf目次都在scf。
成机械码之后编译器在生,进制代码和数据写入文件里需要按照ELF格局把二,全局变量处置成实在地址然后用毗连器把函数和,x系统加载运转了就能够被Linu。
|