1. 思考

多个进程可以加载相同的共享链接库,比如C语言的运行库,加载运行库采用内存映射文件的方式,可以延迟对于文件内容的读入操作。

共享链接库文件,是一个elf格式的库文件,里面会包含多个不同的section,比如text/data/bss section。

不同的section的访问方式和权限都有差别,比如text section可能一般要求“只读、可以执行”的权限,而data/bss section最起码要在“可读、可写”的权限。

那么,这种不同权限的section在内存映射时,是怎样区分对待,映射到不同的内存区域中的呢?

 

Linux下的共享链接库可以通过dlopen函数来加载,该函数会负责将一个共享链接库的不同的section以不同的方式映射到进程的地址空间中,

   1: daniel@ubuntu:/proc$ cat /proc/self/maps
   2: 00262000-00280000 r-xp 00000000 08:01 525208     /lib/i386-linux-gnu/ld-2.13.so
   3: 00280000-00281000 r--p 0001d000 08:01 525208     /lib/i386-linux-gnu/ld-2.13.so
   4: 00281000-00282000 rw-p 0001e000 08:01 525208     /lib/i386-linux-gnu/ld-2.13.so
002df000-00455000 r-xp 00000000 08:01 525221     /lib/i386-linux-gnu/libc-2.13.so
00455000-00457000 r--p 00176000 08:01 525221     /lib/i386-linux-gnu/libc-2.13.so
00457000-00458000 rw-p 00178000 08:01 525221     /lib/i386-linux-gnu/libc-2.13.so
   8: 00458000-0045b000 rw-p 00000000 00:00 0 
   9: 009b8000-009b9000 r-xp 00000000 00:00 0          [vdso]
  10: 08048000-08051000 r-xp 00000000 08:01 1310739    /bin/cat
  11: 08051000-08052000 r--p 00008000 08:01 1310739    /bin/cat
  12: 08052000-08053000 rw-p 00009000 08:01 1310739    /bin/cat
  13: 08fad000-08fce000 rw-p 00000000 00:00 0          [heap]
  14: b7516000-b7517000 r--p 0043a000 08:01 3021821    /usr/lib/locale/locale-archive
  15: b7517000-b7557000 r--p 002bd000 08:01 3021821    /usr/lib/locale/locale-archive
  16: b7557000-b7757000 r--p 00000000 08:01 3021821    /usr/lib/locale/locale-archive
  17: b7757000-b7758000 rw-p 00000000 00:00 0 
  18: b7768000-b776a000 rw-p 00000000 00:00 0 
  19: bf9e6000-bfa07000 rw-p 00000000 00:00 0          [stack]

相关文章: