作者:zhanhailiang 日期:2014-10-26
linux程序动态库载入流程简单介绍
linux从程序(program或对象)变成进程(process或进程),简单说来须要经过三步:
-
fork进程,在内核创建进程相关内核项,载入进程可运行文件;
-
查找依赖的.so,逐一载入映射虚拟地址;
-
初始化程序变量;
例如以下例通过strace查看pwd命令运行过程:
[root@~/wade/codeReview/learningc]# strace pwd execve("/bin/pwd", ["pwd"], [/* 24 vars */]) = 0 brk(0) = 0x1c77000 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f06eb011000 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory) open("/etc/ld.so.cache", O_RDONLY) = 3 fstat(3, {st_mode=S_IFREG|0644, st_size=29690, ...}) = 0 mmap(NULL, 29690, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f06eb009000 close(3) = 0 open("/lib64/libc.so.6", O_RDONLY) = 3 read(3, "177ELF2113 3 >