标签:
以C语言为例,c代码经过编译器的预处理,编译成汇编代码,由汇编器编译成目标代码,再链接成可执行文件,由操作系统加载到cpu里来执行。
(截图)
.c----.asm(.s)-----.o(二进制文件)-----A.out(可执行文件)
预处理负责把include的文件包含进来及宏替换等工作
可执行文件是使用共享库的。
-static
把库里的东西都放在里面了所以比较大
可执行文件的内部是怎样的?
(截图)
文件格式:
目标文件格式和ABI应用程序二进制接口适应到某一种cpu格式
一个共享文件(代码和数据,连接编译器和动态连接器)
(截图)
gccs readelf -h main
映射代码中各种数据对应到进程空间的地址。例如:在文件中的代码段,拷贝到进程的空间时;数据段拷贝到进程空间。
文件映射进程地址空间
0xc000000开始是用户态可以使用的
0x8048000默认的加载地址
0x8048X00程序的真实入口,可执行文件加载到内存中开始执行的第一行代码
一般静态链接会将所有代码放在一个代码段
动态链接的进程会有多个代码段
可执行程序的的执行环境
命令行参数和shell环境
int execve(int char filename,char argv[],char *const envp[]);//函数原型,先函数调用参数传递,再系统调用参数传递
(截图不能用)
(截图不能用)命令行参数和环境变量,fork一个子进程时完全复制父进程的,然后调用execv时,把当前的可执行程序把原来的环境(子进程)给覆盖掉,子进程的用户态堆栈也被清空了,因为新的进程要执行。
内核处理函数创建一个新的可执行程序用户态堆栈的同时,将命令行参数和环境变量拷贝进去
shell程序--execve--对应的系统调用sys_execv--然后在初始化时拷贝
gcc mian.c -o main -l/path/to/your/dir -lshlibexample -ldl -m32
//分别指定头文件的路径和库文件的路径,动态加载
export LD_LIBRARY_PATH=$PWD
//将当前目录加入默认路径
./main
标签:
原文地址:http://www.cnblogs.com/wuxiyao/p/5361677.html