Featured image of post 一次关于proc的分析

一次关于proc的分析

基础知识

一次关于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工作的流程。

Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
Built with Hugo
Theme Stack designed by Jimmy