文章分类 -  《程序员的自我修养——链接、装载与库》

摘要:1.介绍 在《入口函数与程序初始化浅析》一文中我们说过,程序首先运行的代码并不是main的第一行,而是运行库中的某个入口函数。在入口函数对运行库和程序运行环境进行各种初始化,完成初始化后再调用main函数,正式开始实行程序主体部分。执行完后返回到入口函数,进行清理工作。 接下来我们就以书中第13章的 阅读全文
posted @ 2023-06-12 23:02 Hell0er 阅读(283) 评论(0) 推荐(0)
摘要:1.程序开始的真相 操作系统装载程序之后,首先运行的代码并不是main的第一行,而是某些别的代码。这些代码负责准备好main函数执行所需要的环境,并且负责调用main函数。 铁证1: 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 int a = 3; 阅读全文
posted @ 2023-06-09 11:56 Hell0er 阅读(907) 评论(0) 推荐(0)
摘要:阅前声明:本文是一篇“复现、验证和笔记”,更详细的内容还请查看文末链接中的第一篇博客,作者写得非常好 : ) 1.为什么要动态链接 在多进程背景下,一个程序可能会使用库文件(如glibc标准库),如果运行着多个进程,则每个进程都需要一份glibc,操作系统就需要在物理内存中加载多份glibc,浪费内 阅读全文
posted @ 2023-06-08 20:10 Hell0er 阅读(80) 评论(0) 推荐(0)
摘要:阅前声明:本文是一篇“复现、验证和笔记”,更详细的内容还请查看文末链接中的博客,作者写得非常好 : ) 1.为什么要静态链接 假设我们有如下C程序: 1 // a.c 2 extern int shared; 3 int main() 4 { 5 int a = 100; 6 swap(&a, &s 阅读全文
posted @ 2023-06-06 15:09 Hell0er 阅读(166) 评论(0) 推荐(0)
摘要:ELF文件的作用就不多介绍了。需要说明的是,.c文件生成的.o目标对象文件和可执行文件都属于ELF格式文件,二者的内容当然也有所不同,下面对其进行简单分析。 假设我们有如下C程序: 1 // simple_section.c 2 int printf( const char* format, ... 阅读全文
posted @ 2023-06-01 15:24 Hell0er 阅读(75) 评论(0) 推荐(0)