系统处理过程
<ul>
<li><a href="https://www.topgoer.cn/docs/data-structures-questions/data-structures-questions-1d94t1bk0bgcl#%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86">https://www.topgoer.cn/docs/data-structures-questions/data-structures-questions-1d94t1bk0bgcl#%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86</a></li>
</ul>
<h2>Unix 系统上,编译器把源文件转换为目标文件过程</h2>
<ul>
<li>程序->预处理器->编译器->汇编器->链接器->可执行目标程序(二进制)</li>
</ul>
<h2>静态链接</h2>
<ul>
<li>静态连接器以一组可重定向目标文件为输入,生成一个完全链接的可执行目标文件作为输出</li>
</ul>
<h2>链接器主要完成任务</h2>
<ul>
<li>符号解析
<ul>
<li>每个符号对应于一个函数、一个全局变量或一个静态变量,符号解析的目的是将每个符号引用与一个符号定义关联起来。</li>
</ul></li>
<li>重定位
<ul>
<li>链接器通过把每个符号定义与一个内存位置关联起来,然后修改所有对这些符号的引用,使得它们指向这个内存位置。</li>
</ul></li>
</ul>
<h2>目标文件</h2>
<ul>
<li>可执行目标文件
<ul>
<li>可以直接在内存中执行;</li>
</ul></li>
<li>可重定向目标文件
<ul>
<li>可与其它可重定向目标文件在链接阶段合并,创建一个可执行目标文件;</li>
</ul></li>
<li>共享目标文件
<ul>
<li>这是一种特殊的可重定向目标文件,可以在运行时被动态加载进内存并链接;</li>
</ul></li>
</ul>
<h2>静态库问题</h2>
<ul>
<li>当静态库更新时那么整个程序都要重新进行链接;</li>
<li>对于 printf 这种标准函数库,如果每个程序都要有代码,这会极大浪费资源。</li>
</ul>
<h2>共享库</h2>
<ul>
<li>为了解决静态库的这两个问题而设计的,</li>
<li>在 Linux 系统中通常用 .so 后缀来表示,</li>
<li>Windows 系统上它们被称为 DLL</li>
</ul>
<h2>共享库特点</h2>
<ul>
<li>在给定的文件系统中一个库只有一个文件,所有引用该库的可执行目标文件都共享这个文件,它不会被复制到引用它的可执行文件中;</li>
<li>在内存中,一个共享库的 .text 节(已编译程序的机器代码)的一个副本可以被不同的正在运行的进程共享。</li>
</ul>