瓜而不皮的懒羊羊 發表於 2023-7-15 00:00:00

Linux下将源文件编译成目标文件的过程解析

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>
        简介</li><li>
        解答</li><li>
        总结</li></ul></div><p class="maodian"></p><h2>
        简介</h2>
<p>
        请讲一下linux如何源文件逐步编译成可执行文件。</p>
<p class="maodian"></p><h2>
        解答</h2>
<p>
        首先先上图对编译的整个过程有个感性的认识,然后再逐步分析各个过程。</p>
<p>
        以hello.c 程序为例</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_782079">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp preprocessor"># include &lt;stdio.h&gt;</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp plain">main{</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp functions bold">printf</code><code class="cpp plain">(</code><code class="cpp string">"hello\n"</code><code class="cpp plain">);</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp plain">}</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        一个.c源程序需要经过预处理器生成.i文件,再经过编译器生成.s文件,再经过汇编器生成可重定位目标文件.o文件,再与其他.o文件经过链接器生成最终的可执行目标程序。</p>
<p>
        预处理阶段。主要是处理源文件中以“#”开头的预编译指令。</p>
<p>
        删除#define并展开宏</p>
<p>
        处理所有条件预编译指令,如#if, #ifdef, #endif</p>
<p>
        插入头文件到“#include”处</p>
<p>
        删除所有注释</p>
<p>
        添加行号和文件名标识,以便编译时编译器产生调试用的行号信息</p>
<p>
        保留所有#pragma编译指令。</p>
<p>
        编译阶段。将预处理得到的预处理文件进行语法分析,词法分析,语义分析,优化后,生成汇编代码文件(汇编语言源程序)。</p>
<p>
        汇编阶段。利用汇编程序(汇编器)将汇编语言源程序转换成机器指令序列(机器语言程序)。</p>
<p>
        链接阶段。将多个可重定位的目标文件.o合并以生成可执行文件,其可以被加载到内存中,由系统执行。</p>
<p class="maodian"></p><h2>
        总结</h2>
<p>
        以上就是本文关于Linux下将源文件编译成目标文件的过程解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!</p>
<p>
        原文链接:http://blog.csdn.net/u011361880/article/details/77601742</p>
頁: [1]
查看完整版本: Linux下将源文件编译成目标文件的过程解析