不用链接C库的裸程序,向标准输出打印hello并调用exit退出:
ldd 可以看到依赖了C库, vdso及ld解释器(loader)。
关于vdso, 为了提高时间相关的系统调用效率,内核会把时间及时刷新到一块内存上,把这段内存再映射到用户空间,获取这这些数据相关的代码就是在vdso中实现的,映射到用户空间的内存数据就是vvar。找一个运行中的程序,内存映射如下,vvar即是存储了时间的只读数据段,vdso即是访问它的代码段:
ld-linux-aarch64.so 是一个加载器,在命令行上运行程序时,bash终端执行fork, exec打开a.out,a.out需要解释器,内核就将ld-linux-aarch64.so映射进来,接下来ld-linux-aarch64.so 将a.out依赖的动态库加载到进程地址空间(代码段,数据段等映射进来),准备好相关工作后,调用a.out入口点_start 。
用strace 查看a.out执行相关的系统调用,没有ld-linux-aarch64.so, 是因为execve执行时,内核把它加载了。
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。