<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>编译链接 on 鹿鸣青野的blog</title><link>https://www.sylgalaxy.xyz/tags/%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5/</link><description>Recent content in 编译链接 on 鹿鸣青野的blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 13 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://www.sylgalaxy.xyz/tags/%E7%BC%96%E8%AF%91%E9%93%BE%E6%8E%A5/index.xml" rel="self" type="application/rss+xml"/><item><title>C/C++ 内存布局、程序构建与静态库动态库</title><link>https://www.sylgalaxy.xyz/posts/cpp-memory-layout/</link><pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate><guid>https://www.sylgalaxy.xyz/posts/cpp-memory-layout/</guid><description>&lt;p&gt;从内存区域划分（&lt;code&gt;.text&lt;/code&gt; / &lt;code&gt;.rodata&lt;/code&gt; / &lt;code&gt;.data&lt;/code&gt; / &lt;code&gt;.bss&lt;/code&gt; / 栈 / 堆）讲到构建四阶段（预处理 → 编译 → 汇编 → 链接），再到静态库与动态库的创建、链接行为差异，末尾汇总易错点。&lt;/p&gt;
&lt;h2 id="一内存布局在构建阶段就确定"&gt;一、内存布局在构建阶段就确定&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Determined at Build Time：&lt;code&gt;.text&lt;/code&gt; / &lt;code&gt;.rodata&lt;/code&gt; / &lt;code&gt;.data&lt;/code&gt; / &lt;code&gt;.bss&lt;/code&gt; 的内存布局、大小在编译链接构建阶段就确定，不是程序跑起来才决定。这几段都属于 &lt;strong&gt;static lifetime 静态生命周期&lt;/strong&gt;，由编译器自动管理分配与释放，程序员不能手动干预申请释放。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;按数据类型、生命周期和作用域，C/C++ 程序的内存通常划分为五大区域：&lt;strong&gt;代码区、全局/静态存储区、栈区、堆区、常量区&lt;/strong&gt;。其中代码区对应 &lt;code&gt;.text&lt;/code&gt;，常量区对应 &lt;code&gt;.rodata&lt;/code&gt;，全局/静态存储区对应 &lt;code&gt;.data&lt;/code&gt; 与 &lt;code&gt;.bss&lt;/code&gt;，栈区与堆区则在运行时分配。&lt;/p&gt;
&lt;h3 id="1-text-代码段文本段--代码区"&gt;1. &lt;code&gt;.text&lt;/code&gt; 代码段（文本段 / 代码区）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;存储内容&lt;/strong&gt;：编译之后的机器指令（machine code），即写出的函数、&lt;code&gt;if&lt;/code&gt;/&lt;code&gt;for&lt;/code&gt; 循环、&lt;code&gt;main&lt;/code&gt; 函数等翻译成 CPU 能执行的指令。所有的函数定义、控制结构都会被转换成机器指令存放在这里。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大小&lt;/strong&gt;：Fixed size，构建阶段确定大小。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限&lt;/strong&gt;：Read-only &lt;strong&gt;只读&lt;/strong&gt;，防止运行时篡改程序指令。这部分内存是共享的，在程序执行期间不会改变。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生命周期&lt;/strong&gt;：静态生命周期，进程整个运行期间都存在，进程退出由操作系统回收。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;管理&lt;/strong&gt;：完全由编译器、链接器自动管理，程序员没有 API 手动分配释放本段内存。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;编译时，&lt;code&gt;main&lt;/code&gt;、&lt;code&gt;func&lt;/code&gt; 等函数的代码被转换成机器指令存放在可执行文件的代码段中（此时还在磁盘上的可执行文件里）；程序运行时，操作系统把这些指令加载到内存的代码段，CPU 再从内存的代码段中读取并执行。&lt;/p&gt;
&lt;h3 id="2-rodata-只读数据段常量区"&gt;2. &lt;code&gt;.rodata&lt;/code&gt; 只读数据段（常量区）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;存储内容&lt;/strong&gt;：初始化后的常量，比如字符串字面量 &lt;code&gt;&amp;quot;hello world&amp;quot;&lt;/code&gt;、&lt;code&gt;const char *p = &amp;quot;abc&amp;quot;&lt;/code&gt; 这类常量字符串，以及全局 &lt;code&gt;const&lt;/code&gt; 常量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;权限&lt;/strong&gt;：只读 Read-only，程序运行不能修改，写操作会触发段错误。这部分内存同样通常在程序执行期间不会改变。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;区分：&lt;code&gt;const int a = 10;&lt;/code&gt; 声明在全局放 rodata；局部 &lt;code&gt;const&lt;/code&gt; 变量本质还是在栈上。&lt;/p&gt;</description></item></channel></rss>