编程基础
leon_unique
这个作者很懒,什么都没留下…
展开
-
Windows下动态链接
Dll即动态链接库,相当于Linux下的共享对象。Windows下的类ELF文件称为PE文件,它属于PE/COFF格式。 PE里面有两个常用的概念,基地址和相对地址(RVA);当一个PE文件被装载时,其进程地址空间中的起始地址就是基地址,任何一个PE文件都有一个优先加载的基地址,PE文件头中的Image Base。 通过简单示例,了解DLL的创建和使用,其中最基原创 2013-03-26 08:45:28 · 860 阅读 · 0 评论 -
静态链接
当我们有两个目标文件时,如何将它们链接起来形成一个可执行文件?使用以下两个源代码文件作为例子展开分析: // a.cextern int shared;int main(){ int a = 100; swap(&a, &shared);}// b.cint shared = 1;void swap(int* a, int* b){ *a原创 2013-03-25 16:59:21 · 928 阅读 · 0 评论 -
可执行文件的装载
这里,我们从OS的角度来阐述一个可执行文件如何被装载,并且同时在进程中执行。一个可执行文件从装载到执行,最开始只需要做三件事情:创建一个独立的虚拟地址空间读取可执行文件头,并且建立虚拟空间与可执行文件的映射关系将CPU指令寄存器设置成可执行文件的入口地址,启动运行Linux下,创建虚拟地址空间只是分配一个页目录就可以了,甚至不设置页映射关系。当程序发生页错误时,OS将从物理内存中分原创 2013-03-25 17:04:54 · 1310 阅读 · 0 评论 -
Linux系统调用
系统调用是应用程序与操作系统内核之间的接口,它决定了程序如何与内核打交道的。无论程序是直接进行系统调用,还是通过运行库,最终还是会到达系统调用这个层面上。x86系统下,Linux系统使用0x80号中断作为系统调用的入口。EAX寄存器用于表示系统调用的接口号,比如EAX=1表示退出进程,EAX=2表示创建进程,EAX=3表示读取文件,EAX=4表示写文件等。每一个系统调用都对应于内核代码中的一个函数原创 2013-03-26 08:49:48 · 1108 阅读 · 0 评论 -
Linux下动态链接
Linux系统中,ELF动态链接文件被称为动态共享对象(DSO),简称共享对象,它们一般都是以“.so”为扩展名的一些文件;Windows中,动态链接文件被称为动态链接库(.dll)。下面是一个简单的例子:[cpp] view plaincopy#include "lib.h" int main() { foobar(1原创 2013-03-25 17:34:31 · 1209 阅读 · 0 评论 -
Linux内存布局
Linux下一个进程里典型的内存布局:一般来讲,程序使用的内存空间里有如下默认的区域:栈:用于维护程序上下文堆:用来容纳应用程序动态分配的内存区域可执行文件映像:可执行文件在内存里的映像保留区:内存中受到保护而禁止访问的内存区域的总称 栈,在程序运行中具有举足轻重的地位。它保存了一个函数调用所需要的维护信息,这常常被称为堆栈帧或活动区域。堆栈帧一般包括如下原创 2013-03-26 08:47:57 · 992 阅读 · 0 评论 -
目标文件
现在PC平台流行的可执行文件格式主要是Windows下的PE(Portable Executable)和Linux下的ELF(Executable Linkable Format),它们都是COFF(Common file format)格式的变种。目标文件就是源代码编译后但未链接的那些中间文件,它跟可执行文件的内容与结构很相似,一般跟可执行文件格式采用同一种格式存储 动态链接库、静态原创 2013-03-25 16:47:40 · 1122 阅读 · 0 评论