<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title></title>
    <link>https://k8s-dia.xyz/</link>
    <description>Recent content from </description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    
    <managingEditor>3388752540ding@gmail.com (丁锦安)</managingEditor>
    <webMaster>3388752540ding@gmail.com (丁锦安)</webMaster>
    
    <copyright>本博客所有文章除特别声明外，均采用 BY-NC-SA 许可协议。转载请注明出处！</copyright>
    
    <lastBuildDate>Sat, 05 Sep 2026 20:02:28 +0800</lastBuildDate>
    
    
    <atom:link href="https://k8s-dia.xyz/index.xml" rel="self" type="application/rss&#43;xml" />
    

    
    

    <item>
      <title>My First Post</title>
      <link>https://k8s-dia.xyz/post/my-first-post/</link>
      <pubDate>Sat, 05 Sep 2026 20:02:28 &#43;0800</pubDate>
      <author>3388752540ding@gmail.com (丁锦安)</author>
      <guid>https://k8s-dia.xyz/post/my-first-post/</guid>
      <description>
        <![CDATA[<h1>My First Post</h1><p>作者：丁锦安（3388752540ding@gmail.com）</p>
        
          <h1 id="linux-elf与cc底层运行机制全景揭秘">
<a class="header-anchor" href="#linux-elf%e4%b8%8ecc%e5%ba%95%e5%b1%82%e8%bf%90%e8%a1%8c%e6%9c%ba%e5%88%b6%e5%85%a8%e6%99%af%e6%8f%ad%e7%a7%98"></a>
《Linux ELF与C/C++底层运行机制全景揭秘》
</h1><h2 id="第-1-章-导论">
<a class="header-anchor" href="#%e7%ac%ac-1-%e7%ab%a0-%e5%af%bc%e8%ae%ba"></a>
<strong>第 1 章 导论</strong>
</h2><h3 id="1elf-文件的三种基本形态-o-可重定位文件so-共享库executable-可执行文件">
<a class="header-anchor" href="#1elf-%e6%96%87%e4%bb%b6%e7%9a%84%e4%b8%89%e7%a7%8d%e5%9f%ba%e6%9c%ac%e5%bd%a2%e6%80%81-o-%e5%8f%af%e9%87%8d%e5%ae%9a%e4%bd%8d%e6%96%87%e4%bb%b6so-%e5%85%b1%e4%ba%ab%e5%ba%93executable-%e5%8f%af%e6%89%a7%e8%a1%8c%e6%96%87%e4%bb%b6"></a>
1.ELF 文件的三种基本形态 (.o 可重定位文件、.so 共享库、Executable 可执行文件)
</h3><h4 id="1-1可重定位文件-relocatable-file-o-文件">
<a class="header-anchor" href="#1-1%e5%8f%af%e9%87%8d%e5%ae%9a%e4%bd%8d%e6%96%87%e4%bb%b6-relocatable-file-o-%e6%96%87%e4%bb%b6"></a>
1. 1可重定位文件 (Relocatable File, .o 文件)
</h4><ul>
<li><strong>诞生阶段</strong>：由编译器和汇编器生成。当你执行 gcc -c main.c -o main.o 时，得到的就是可重定位文件。静态库（.a 文件）本质上也就是把多个 .o 文件打包压缩在一起的集合（类似于零部件仓库）。</li>
<li><strong>核心特征</strong>：
<ul>
<li><strong>地址未定</strong>：在这个阶段，代码里所有的函数地址、全局变量地址全都是 0x00000000（或者相对偏移）。因为此时编译器不知道这个文件最终会被放在内存的哪个位置。</li>
<li><strong>重定位表（Relocation Table）</strong>：这是 .o 文件最重要的资产。它包含 .rela.text 和 .rela.data 这样的节（Section），里面记录着一张“待办事项表”：“请链接器在最终合并时，帮我把第 15 行的 printf 地址填上真正的内存地址。”</li>
<li><strong>只有 SHT，通常没有 PHT</strong>：因为它不需要被操作系统直接加载到内存运行，所以不需要 PHT（程序头表）。它主要是给<strong>链接器 (Linker)</strong> 看的。</li>
</ul>
</li>
<li><strong>ELF 头标志</strong>：e_type = ET_REL (值为 1)</li>
</ul>
<h4 id="1-2-可执行文件-executable-file-通常无后缀">
<a class="header-anchor" href="#1-2-%e5%8f%af%e6%89%a7%e8%a1%8c%e6%96%87%e4%bb%b6-executable-file-%e9%80%9a%e5%b8%b8%e6%97%a0%e5%90%8e%e7%bc%80"></a>
1. 2 可执行文件 (Executable File, 通常无后缀)
</h4><ul>
<li><strong>诞生阶段</strong>：由链接器（ld）将多个 .o 文件（以及 .a 静态库）缝合在一起，完成地址分配和符号决议后生成。当你执行 gcc main.o utils.o -o my_app 时产生。</li>
<li><strong>核心特征</strong>：
<ul>
<li><strong>地址已绑定</strong>：所有的内部函数调用、全局变量访问的地址，都已经被链接器修正并固定下来了（或者通过相对地址固定）。</li>
<li><strong>拥有入口点（Entry Point）</strong>：ELF Header 中的 e_entry 字段不再为空，它指向程序的绝对起始指令地址（通常是 _start）。</li>
<li><strong>PHT 是绝对核心</strong>：它必须包含 Program Header Table。当你执行这个文件时，内核的 execve 系统调用完全依赖 PHT 来把文件的各个段（代码段、数据段）映射到虚拟内存中。</li>
</ul>
</li>
<li><strong>ELF 头标志</strong>：
<ul>
<li>传统非随机化程序：e_type = ET_EXEC (值为 2)</li>
<li>**【进阶注意】**现代 Linux 默认开启 PIE（位置无关可执行文件）安全机制，为了让可执行文件也能每次在内存中随机浮动，现代的 Executable 实际上被标记为 e_type = ET_DYN (值为 3)。</li>
</ul>
</li>
</ul>
<h4 id="1-3-共享库文件-shared-object-file-so-文件">
<a class="header-anchor" href="#1-3-%e5%85%b1%e4%ba%ab%e5%ba%93%e6%96%87%e4%bb%b6-shared-object-file-so-%e6%96%87%e4%bb%b6"></a>
1. 3 共享库文件 (Shared Object File, .so 文件)
</h4><blockquote>
<p><strong>通俗比喻</strong>：城市里的公共加油站或共享充电宝。每辆车（每个进程）需要的时候都可以去用它，而且全城只需要建一份。</p>
        
        <hr><p>本文2026-09-05首发于<a href='https://k8s-dia.xyz/'></a>，最后修改于2026-09-05</p>]]>
      </description>
      
    </item>
    
  </channel>
</rss>
