<?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>GCC on Rancho&#39;s Notes</title>
    <link>https://fan-pengfei.top/tags/gcc/</link>
    <description>Recent content in GCC on Rancho&#39;s Notes</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Sat, 09 Jul 2022 13:52:33 +0000</lastBuildDate>
    <atom:link href="https://fan-pengfei.top/tags/gcc/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>GCC常见命令及用法</title>
      <link>https://fan-pengfei.top/posts/gcc%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E5%8F%8A%E7%94%A8%E6%B3%95/</link>
      <pubDate>Sat, 09 Jul 2022 13:52:33 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/gcc%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E5%8F%8A%E7%94%A8%E6%B3%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;GCC工具介绍以及常见的用法；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&#34;gcc编译命令&#34;&gt;GCC编译命令：&lt;/h1&gt;
&lt;h2 id=&#34;1-gcc工具&#34;&gt;1. GCC工具&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;GCC编译器：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GCC（GNU Compiler Collection）是由 GNU 开发的编程语言编译器。 GCC最初代表“GNU C Compiler”，当时只支持C语言。 后来又扩展能够支持更多编程语言，包括 C++、Fortran 和 Java 等。 因此，GCC也被重新定义为“GNU Compiler Collection”，成为历史上最优秀的编译器， 其执行效率与一般的编译器相比平均效率要高 20%~30%。&lt;/p&gt;
&lt;p&gt;GCC的官网地址为：&lt;a href=&#34;https://link.zhihu.com/?target=https%3A//gcc.gnu.org/&#34;&gt;https://gcc.gnu.org/&lt;/a&gt;，在Ubuntu系统下系统默认已经安装好GCC编译器，可以通过如下命令查看Ubuntu系统中GCC编译器的版本及安装路径：&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/gcc%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E5%8F%8A%E7%94%A8%E6%B3%95/img-1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;GCC编译工具链：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GCC编译工具链（toolchain），是指以GCC编译器为核心的一整套工具。它主要包含以下三部分内容：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;gcc-core：即GCC编译器，用于完成预处理和编译过程，把C代码转换成汇编代码。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Binutils ：除GCC编译器外的一系列小工具包括了链接器ld，汇编器as、目标文件格式查看器readelf等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;glibc：包含了主要的 C语言标准函数库，C语言中常常使用的打印函数printf、malloc函数就在glibc 库中。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在很多场合下会直接用GCC编译器来指代整套GCC编译工具链。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Binutils工具集：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Binutils（bin utility），是GNU二进制工具集，通常跟GCC编译器一起打包安装到系统，它的官方说明网站地址为： &lt;a href=&#34;https://link.zhihu.com/?target=https%3A//www.gnu.org/software/binutils/&#34;&gt;https://www.gnu.org/software/binutils/&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;在进行程序开发的时候通常不会直接调用这些工具，而是在使用GCC编译指令的时候由GCC编译器间接调用。下面是其中一些常用的工具：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;as：汇编器，把汇编语言代码转换为机器码（目标文件）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;ld：链接器，把编译生成的多个目标文件组织成最终的可执行程序文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;readelf：可用于查看目标文件或可执行程序文件的信息。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;nm ： 可用于查看目标文件中出现的符号。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;objcopy： 可用于目标文件格式转换，如.bin 转换成 .elf 、.elf 转换成 .bin等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;objdump：可用于查看目标文件的信息，最主要的作用是反汇编。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;size：可用于查看目标文件不同部分的尺寸和总尺寸，例如代码段大小、数据段大小、使用的静态内存、总大小等。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;系统默认的Binutils工具集位于/usr/bin目录下，可使用如下命令查看系统中存在的Binutils工具集：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 在Ubantu上执行如下命令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ls /usr/bin/ | grep linux-gnu-
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/gcc%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E5%8F%8A%E7%94%A8%E6%B3%95/img-2.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;glibc库：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;glibc库是GNU组织为GNU系统以及Linux系统编写的C语言标准库，因为绝大部分C程序都依赖该函数库，该文件甚至会直接影响到系统的正常运行，例如常用的文件操作函数read、write、open，打印函数printf、动态内存申请函数malloc等。&lt;/p&gt;
&lt;p&gt;在Ubuntu系统下，libc.so.6是glibc的库文件，可直接执行该库文件查看版本，在主机上执行如下命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-powershell&#34; data-lang=&#34;powershell&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 在Ubantu上执行如下命令&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# 以下是Ubuntu 64位机的glibc库文件路径，可直接执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/lib/x86_64-linux-gnu/libc.so.6
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/gcc%E5%B8%B8%E8%A7%81%E5%91%BD%E4%BB%A4%E5%8F%8A%E7%94%A8%E6%B3%95/img-3.jpg&#34;&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>GCC学习记录</title>
      <link>https://fan-pengfei.top/posts/gcc%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</link>
      <pubDate>Thu, 02 Sep 2021 01:20:43 +0000</pubDate>
      <guid>https://fan-pengfei.top/posts/gcc%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;GCC常用命令；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;1-什么是gcc&#34;&gt;1. 什么是gcc&lt;/h2&gt;
&lt;p&gt;gcc的全称是GNU Compiler Collection，它是一个能够编译多种语言的编译器。最开始gcc是作为C语言的编译器（GNU C Compiler），现在除了c语言，还支持C++、java、Pascal等语言。gcc支持多种硬件平台。&lt;/p&gt;
&lt;h2 id=&#34;2-gcc的特点&#34;&gt;2. gcc的特点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;gcc是一个可移植的编译器，支持多种硬件平台。例如ARM、X86等等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gcc不仅是个本地编译器，它还能跨平台交叉编译。所谓的本地编译器，是指编译出来的程序只能够在本地环境进行运行。而gcc编译出来的程序能够在其他平台进行运行。例如嵌入式程序可在x86上编译，然后在arm上运行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gcc有多种语言前端，用于解析不同的语言。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gcc是按模块化设计的，可以加入新语言和新CPU架构的支持。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;gcc是自由软件。任何人都可以使用或更改这个软件。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;3-gcc编译程序的过程&#34;&gt;3. gcc编译程序的过程&lt;/h2&gt;
&lt;p&gt;gcc编译程序主要经过四个过程：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;预处理（Pre-Processing）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;编译 （Compiling）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;汇编 （Assembling）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;链接 （Linking）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img alt=&#34;img&#34; loading=&#34;lazy&#34; src=&#34;https://fan-pengfei.top/posts/gcc%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/img-1.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;预处理实际上是将头文件、宏进行展开。编译阶段，gcc调用不同语言的编译器，例如c语言调用编译器ccl。gcc实际上是个工具链，在编译程序的过程中调用不同的工具。汇编阶段，gcc调用汇编器进行汇编。链接过程会将程序所需要的目标文件进行链接成可执行文件。汇编器生成的是可重定位的目标文件，学过操作系统，我们知道，在源程序中地址是从0开始的，这是一个相对地址，而程序真正在内存中运行时的地址肯定不是从0开始的，而且在编写源代码的时候也不能知道程序的绝对地址，所以&lt;strong&gt;重定位&lt;/strong&gt;能够将源代码的代码、变量等定位为内存具体地址。下面以一张图来表示这个过程，注意过程中文件的后缀变化，编译选项和这些后缀有关。&lt;/p&gt;
&lt;p&gt;这是GCC编译的四个步骤。&lt;/p&gt;
&lt;h2 id=&#34;4-gcc常用选项&#34;&gt;4. gcc常用选项&lt;/h2&gt;
&lt;p&gt;来看一下gcc常用选项&lt;/p&gt;
&lt;p&gt;选项名
作用&lt;/p&gt;
&lt;p&gt;-o
产生目标（.i、.s、.o、可执行文件等）&lt;/p&gt;
&lt;p&gt;-E
只运行C预编译器&lt;/p&gt;
&lt;p&gt;-S
告诉编译器产生汇编程序文件后停止编译，产生的汇编语言文件拓展名为.s&lt;/p&gt;
&lt;p&gt;-c
通知gcc取消连接步骤，即编译源码，并在最后生成目标文件&lt;/p&gt;
&lt;p&gt;-Wall
使gcc对源文件的代码有问题的地方发出警告&lt;/p&gt;
&lt;p&gt;-Idir
将dir目录加入搜索头文件的目录路径&lt;/p&gt;
&lt;p&gt;-Ldir
将dir目录加入搜索库的目录路径&lt;/p&gt;
&lt;p&gt;-llib
连接lib库&lt;/p&gt;
&lt;p&gt;-g
在目标文件中嵌入调试信息，以便gdb之类的调试程序调试&lt;/p&gt;
&lt;p&gt;现在我们有源文件hello.c，下面是一些gcc的使用示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc -E hello.c -o hello.i   对hello.c文件进行预处理，生成了hello.i 文件
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc -S hello.i -o hello.s    对预处理文件进行编译，生成了汇编文件
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc -c hello.s -o hello.o  对汇编文件进行编译，生成了目标文件
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc hello.o -o hello 对目标文件进行链接，生成可执行文件
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc hello.c -o hello 直接编译链接成可执行目标文件
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcc -c hello.c 或 gcc -c hello.c -o hello.o 编译生成可重定位目标文件
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;使用gcc时可以加上-Wall选项。下面这个例子如果不加上-Wall选项，编译器不会报出任何错误或警告，但是程序的结果却不是预期的：&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
