一次关于proc的分析
运行:
strace file /proc/version
来一小段
execve("/usr/bin/file", ["file", "/proc/version"], 0x7ffc3c1ee838 /* 25 vars */) = 0
brk(NULL) = 0x5591347ae000
access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=36168, ...}) = 0
mmap(NULL, 36168, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f48f3973000
close(3) = 0
/etc/ld. so.nohwcap 这个文件存在,链接器就只会去load完全无优化的库版本(哪怕CPU支持优化)
/etc/ld.so.preload 这个文件就跟LD_PRELOAD 干一个事情,这玩意在GekkoFS的系统调用截取时用过,preload一下自己的IO库,当发生IO操作,链接器会讲call的func链接到自己的库上去而不是走正常的posix fileIOapi。
brk(NULL) = 0x5591347ae000
这是什么,这就是通过brk找到heap的边界,好了,这里找到是0x5591347ae000,为啥要找呢,是谁要找。—–》 因为程序要用malloc了,那肯定得知道先知道边界,很合理。
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=36168, ...}) = 0
mmap(NULL, 36168, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f48f3973000
close(3) = 0
这一段打开了这个链接器的缓存文件返回fd为3,统计了一下相关信息,mmap再把它映射到mmap region, 然后把他关上,实际上在很多程序中这一段都会出现,他是很通用的CRT和ld工作的流程。