136、【OS】【Nuttx】【周边】效果呈现方案解析:strace 日志解析(二)
【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除
背景
上篇 blog
【OS】【Nuttx】【周边】效果呈现方案解析:strace 日志解析(一)
分析了下 strace
的追踪日志以及里面 open 命令和 openat 命令的区别,下面继续来看下
strace 日志解析
上篇 blog 分析到了 openat 的函数声明,位于 /usr/include/fcntl.h
来看下这里的参数:
- __fd:基础目录的文件描述符
- __file:要打开的文件路径
- __oflag:打开方式,比如只读,写入,创建等
- 返回值:成功时返回一个文件描述符(file descriptor)
下面分析下这里面出现的一些宏定义
- AT_FDCWD:特殊值,表示使用当前工作目录,当调用 openat(AT_FDCWD, “file.txt”, …) 时,等价于 open(“file.txt”, …),是 *at 系列函数的标准用法之一
- O_RDONLY,O_CLOEXEC,O_WRONLY,O_CREAT,O_TRUNC 等宏定义也可以在 nuttx 项目里面的 fcntl.h 头文件中找到
- O_RDONLY:以只读方式打开文件
- O_WRONLY:以只写方式打开文件
- O_RDWR:以读写方式打开文件,相当于 O_RDONLY | O_WRONLY
- O_CREAT:如果文件不存在,就创建一个,必须配合第三个参数 mode(权限模式,比如这里的 0666)使用
- O_TRUNC:如果文件已存在且为普通文件,则清空其内容,必须配合 O_WRONLY 或 O_RDWR 使用,因为要写入
- O_CLOEXEC:当程序调用 exec() 启动新程序时,自动关闭这个打开的文件描述符,防止文件描述符意外泄露给子进程,提高安全性
下面是第 2 行日志,表示该进程开始加载动态链接库缓存,让程序能快速找到其所依赖的库
2715206 openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
- 当程序启动时,ld-linux.so 动态链接器需要快速查找共享库 .so 文件
- 这里
/etc/ld.so.cache
是缓存文件,由 ldconfig 生成,包含系统中所有可用共享库的路径,该缓存文件用 O_RDONLY 只读方式打开,并且如果启动了新进程就自动关闭该文件描述符 - 这里返回了文件描述符 3,表示成功打开
下面是第 3 行日志,表示开始加载 C 标准库(glibc)
2715206 openat(AT_FDCWD, "/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
- 这里的 libc.so.6 是 Linux 下最核心的 C 运行时库,几乎所有程序都依赖它,这里的 *.so.6 中的 6 是 ABI(Application Binary Interface)版本号,表示 glibc 主版本号,当 ABI 发生不兼容变更时,版本号就会增加
- 程序将打开这个标准共享库,并映射到内存中,这样可以调用 printf,malloc 等基础函数,注意区别,上一条日志是读取动态链接库缓存,这条日志是从缓存路径中打开 libc 二进制标准库文件
- 另外,这条日志也返回了 3,这里说明前一个文件(ld.so.cache)已经被关闭了(前一个文件返回的描述符也是 3)
ok,先到这里,下篇 blog 继续