1.动态链接与静态链接区别
首先写一个main.c死循环程序
int mian() {
while (1);
}
进入main.c所在的目录下,打开一个终端,执行动态链接
gcc main.c
在此终端下进行静态链接
gcc -static main.c -o static.out
生成了可执行文件a.out static.out:
比较静态链接和动态链接的时间上的区别:
动态链接花费的时间比静态链接的时间更短。
分别打开两个终端,运行a.out static.out可执行程序,进入死循环状态;新建一个终端输入:top。找到两个程序的进程号
a.out的进程号是8175,在终端中输入pmap 8175(此时不要杀死死循环)
(base) bionic@bionic-DL:~$ pmap 8342
8342: ./static.out
0000000000400000 728K r-x-- static.out
00000000006b6000 24K rw--- static.out
00000000006bc000 4K rw--- [ anon ]
0000000001e23000 140K rw--- [ anon ]
00007ffc0e820000 136K rw--- [ stack ]
00007ffc0e8b8000 12K r---- [ anon ]
00007ffc0e8bb000 4K r-x-- [ anon ]
ffffffffff600000 4K --x-- [ anon ]
total 1052K
(base) bionic@bionic-DL:~$ pmap 8175
8175: ./a.out
000055763c080000 4K r-x-- a.out
000055763c280000 4K r---- a.out
000055763c281000 4K rw--- a.out
00007fb0c3d43000 1948K r-x-- libc-2.27.so
00007fb0c3f2a000 2048K ----- libc-2.27.so
00007fb0c412a000 16K r---- libc-2.27.so
00007fb0c412e000 8K rw--- libc-2.27.so
00007fb0c4130000 16K rw--- [ anon ]
00007fb0c4134000 164K r-x-- ld-2.27.so
00007fb0c4306000 8K rw--- [ anon ]
00007fb0c435d000 4K r---- ld-2.27.so
00007fb0c435e000 4K rw--- ld-2.27.so
00007fb0c435f000 4K rw--- [ anon ]
00007ffcf307d000 136K rw--- [ stack ]
00007ffcf30b4000 12K r---- [ anon ]
00007ffcf30b7000 4K r-x-- [ anon ]
ffffffffff600000 4K --x-- [ anon ]
total 4388K
动态链接的地址空间中比静态链接的多了不少如00007fb0c3d43000 1948K r-x-- libc-2.27.so,就是libc动态链接出来的,rx文件。动态链接后的可执行文件小了很多。
2.pmap是如何实现的呢?
strace pmap 8175
pmap是打开map做read,打印信息
对proc作操作
(base) bionic@bionic-DL:~$ cat /proc/9169/maps
00400000-004b6000 r-xp 00000000 08:04 411558 /home/bionic/static.out
006b6000-006bc000 rw-p 000b6000 08:04 411558 /home/bionic/static.out
006bc000-006bd000 rw-p 00000000 00:00 0
01a13000-01a36000 rw-p 00000000 00:00 0 [heap]
7ffe41024000-7ffe41046000 rw-p 00000000 00:00 0 [stack]
7ffe41186000-7ffe41189000 r--p 00000000 00:00 0 [vvar]
7ffe41189000-7ffe4118a000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall]