1. C 语言程序概述

​ GNU gcc 对 ISO 标准 C89 描述的 C 语言进行了一些扩展,其中一些扩展部分已经包括进 IOS C99 标准中。本节给出了内核中经常用到的一些 gcc 扩展语句的说明。

2. C 程序编译和链接

​ 使用 gcc 汇编器编译 C 语言程序时通常会经过四个处理阶段,即预处理、编译阶段、汇编阶段和链接阶段,如下图所示。

aaarticlea/png;base64,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" alt="image">

​ 在前处理阶段中,gcc 会把 C 程序传递给 C 前处理器(C 预处理器) CPP,对 C 语言程序中指示符和宏进行替换处理,输出纯 C 语言代码

在编译阶段,gcc 把 C 语言程序编译生成对应的与机器相关的 as 汇编语言代码

在汇编阶段,as 汇编器会把汇编代码转换成机器指令,并以特定二进制格式输出保存在目标文件中;

最后 GNU ld 链接器把程序的相关目标文件组合链接在一起,生成程序的可执行映像文件

​ 调用 gcc 的命令行格式为如下:

gcc [选项][-o outfile]  infile ...

其中 infile 是输入的 C 语言文件;outfile 是编译产生的输出文件。对于某次编译过程,并非一定要全部执行这四个阶段,使用命令行选项可以令 gcc 编译过程在某个处理阶段后就停止执行。

gcc -o hello hello.c			//编译hello.c程序,生成可执行文件hello
gcc -S -o hello.s hello.c //编译hello.c程序,生成对应汇编程序hello.s。
gcc -c -o hello.o hello.c //编译hello.c程序,生成对应目标文件hello.o而不链接
[root@rockman 0709]# vim hello.c
[root@rockman 0709]# cat hello.c
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
[root@rockman 0709]# gcc -o hello hello.c
[root@rockman 0709]# ls
hello hello.c
[root@rockman 0709]# gcc -S -o hello.s hello.c
[root@rockman 0709]# ls
hello hello.c hello.s
[root@rockman 0709]# cat hello.s
.file "hello.c"
.section .rodata
.LC0:
.string "Hello world!"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $.LC0, %edi
call puts
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-28)"
.section .note.GNU-stack,"",@progbits
[root@rockman 0709]# gcc -c -o hello.o hello.c
[root@rockman 0709]# ls
hello hello.c hello.o hello.s
[root@rockman 0709]# nm hello.o
0000000000000000 T main
U puts

​ 在编译像 Linux 内核这样包含很多源程序文件的大型程序时,通常使用 make 工具软件对整个程序的编译过程进行自动管理。

3. 圆括号中的组合语句

​ 花括号对 “{...}” 用于把变量声明和语句组合成一个复合语句(组合语句)或一个语句块,这样在语义上这些语句就等同于一条语句。组合语句在花括号后面不需要使用分号。

​ 圆括号中的组合语句,即形如 “({...})” 的语句,可以在 GNU C 中用作一个表达式使用。这样就可以在表达式中使用 loop、switch 语句和局部变量,因此这种形式的语句通常称为语句表达式。语句表达式具有如下示例的形式:

({int y = foo(); int z;
if (y>0) z = y;
else z = -y;
3 + z;})

其中组合语句中最后一条语句必须是后面跟随一个分号的表达式。这个表达式("3 + z")的值即用作整个圆括号括住语句的值。如果最后一条语句不是表达式,那么整个表达式就具有 void 类型,因此没有值。另外,这种表达式中语句声明的任何局部变量都会在整块语句结束后失效。这个示例语句可以像如下形式的赋值语句来使用:

res = x = ({...}) + b;
4. 寄存器变量

​ GNU 对 C 语言的另一个扩充是允许我们把一些变量值放到 CPU 寄存器中,即所谓寄存器变量。这样 CPU 就不用经常花费较长时间访问内存去取值。寄存器变量可以分为两种:全局寄存器变量和局部寄存器变量。全局寄存器变量会在程序的整个运行过程中保留寄存器专门用于几个全局变量。相反,局部寄存器变量不会保留指定的寄存器,而仅在内嵌 asm 汇编语句中最为输入或输出操作数时使用专门的寄存器。

​ gcc 编译器的数据流分析功能本身有能力确定指定的寄存器何时含有正在使用的值,何时可派其他用场。当 gcc 数据流分析功能认为存储在某个局部寄存器变量值无用时就可能会删除之,并且对局部寄存器变量的引用也可能被删除、移动或简化。因此,若不想让 gcc 作这些优化改动,最好在 asm 语句中加上 volatile 关键词。

5. 内联函数

​ 在程序中,通常把一个函数声明为内联(inline)函数,就可以让 gcc 把函数的代码集成到调用该函数的代码中去。这样处理可以去掉函数调用时进入/退出事件开销,从而肯定能够加快执行速度。因此把一个函数声明为内联函数的主要目的就是能够尽量快速的执行函数体。另外,如果内联函数中有常数值,那么在编译期间 gcc 就可能用它来进行一些简化操作,因此并非所有的内联函数的代码都会被嵌入进去。内联函数方法对程序代码的长度影响并不明显。使用内联函数的程序编译产生的目标代码可能会长一些也可能会短一些,这需要根据具体情况来定。

​ 内联函数嵌入调用者代码中的操作时一种优化操作,因此只有进行优化编译时才会执行代码嵌入处理。若编译过程中没有使用优化选项 "-0" ,那么内联函数的代码就不会被真正地嵌入到调用者代码中,而只是作为普通函数来处理。把一个函数声明为内联函数的方式时在函数声明是使用关键词 “inline”。

​ 函数中的某些语句用法可能会使得内联函数的替代操作无法正常进行,或者不适合进行替换操作。例如使用了可变参数、内存分配函数 malloca(),可变长度数据类型、非局部 goto 语句、以及递归函数。编译时可以使用选项 -Winline 让 gcc 对标志成 inline 但不能被替换的函数给出警告信息以及不能替换的原因。

​ 当在一个函数定义中既使用 inline 关键词、又使用 static 关键词,即像下面文件 fs/inide.c 中的内联函数定义一样,那么如果所有对该内联函数的调用都被替换而集成在调用者代码中,并且程序中没有引用过该内联函数的地址,则该内联函数自身的汇编代码就不会被引用过。 在这种情况下,除非我们在编译过程中使用选项 -fkeep-inline-fucntions,否则 gcc 就不会再为该内联函数自身生成实际汇编代码。

​ 由于某些原因,一些对内联函数的调用并不能被集成到函数中去。特别是在内联函数定义之前的调用语句是不会被替换集成的,并且也都不能是递归定义的函数。如果存在一个不能被替换集成的调用,那么内联函数就会像平常一样被编译成汇编代码。当然,如果程序中有引用内联函数地址的语句,那么内联函数也会像平常一样被编译成汇编代码。因为对内联函数地址的引用是不能被替换的。

​ 请注意,内联函数功能已经被包括在 ISO 标准 C99 中,但是该标准定义的内联函数与 gcc 定义的有较大区别。ISO 标准 C99 的内联函数语义丁一一等同于这里使用组合关键词 inline 和 static 的定义,即 “省略” 了关键词 static 。若在程序中需要使用 C99 标准的语义,那么就需要使用编译选项 -std=gnu99。不过为了兼容起见,在这种情况下还是最好使用 inline 和 static 组合。以后 gcc 将最终默认使用 C99 的定义,在希望仍然使用这里定义的语义时,就需要使用选项 -std=gnu89 来指定。

​ 若一个内联函数的定义没有使用关键词 static 那么 gcc 就会假设其他程序文件中也对这个函数有调用。因为一个全局符号只能被定义一次,所以该函数就不能再在其他源文件中进行定义。因此这里对内联函数的调用就不能被替换集成。因此,一个非静态的内联函数总是会被编译出自己的汇编代码来。在这方面,ISO 标准 C99 对不使用 static 关键词的内联函数定义等同于这里使用 static 关键词的定义。

​ 如果在定义一个函数时同时指定了 inline 和 extern 关键词,那么该函数定义仅用于内联集成,并且在任何情况下都不会单独产生该函数自身的汇编代码,即使明确引用了该函数的地址也不会产生。这样的一个地址会比那成一个外部引用,就好像你仅仅声明了函数而没有定义函数一样。

​ 关键词 inline 和 extern 组合在一起的作用机会类同一个宏定义。使用这种组合方式就是把带有组合关键词的一个函数定义放在 .h 头文件中,并且把不含关键词的另一个相同函数定义放在一个库文件中。此时头文件中的定义会让绝大多数对该函数的调用被替换嵌入。如果还有没有被替换的对该函数的调用,那么就会使用(引用)程序文件中或库中的拷贝。

09GNU C语言程序编译的更多相关文章

  1. 李洪强漫谈iOS开发[C语言-004]-开发概述程序设计语言程序编译过程

    汇编语言 指令用特定的名字来标记,这就是汇编语言 人比较容易看懂汇编语言 汇编直接和程序一一对应的 有汇编器把程序翻译成机器码 把高级语言编译成计算机识别的语言 程序编译过程 命令行 UNIX 系统中 ...

  2. C语言程序编译

    原来GCC的含义是GNU C Compiler,当初知识编译C语言,而现在GCC不知编译C语言,除此之外它还支持编译Ada.C++.Java.Object C.Pascal.COBOL.等等许多语言, ...

  3. 最短的可通过编译的C语言程序

    要求:写一个最短的,能通过编译的C语言程序,但不要求能正确运行. 一般人首先想到的是除0.即 int main() { /; } 除0会引发SIGFPE信号(浮点异常). 我们也可以删掉return, ...

  4. linux终端下 编译c语言程序

    linux终端下,编译C语言程序步骤为: 采用vi进行源代码编写,编写完成后,:wq存盘退出,如: vi test.c 在命令行下,运行gcc编译程序,生成执行码,如: gcc  -o test te ...

  5. iOS_02_第一个C语言程序(理解编译、连接、运行)

    一.开发工具的选择 1. 可以用来写代码的工具:记事本.ULtraEdit.Vim.Xcode等. 2. 选择XCode的原因:苹果公司官方提供的开发利器.简化开发的工程.有高亮显示功能. 3. 使用 ...

  6. C语言程序经过编译链接后形成二进制映像文件的组成

    C语言程序经过编译链接后形成二进制映像文件由栈,堆,数据段,代码段组成,其中数据段又分为:只读数据段,已经初始化读写数据段,未初始化数据段(BSS段).如下图所示: 1.栈区(stack):由编译器自 ...

  7. Linux编译C语言程序

    1.首先安装gcc包,运行C++程序,安装gcc-c++ 包 如果没有安装的自行进行安装 2.编辑C语言程序, 打印乘法口诀表 [root@Db1 c]# vim chengfa.c 在编辑界面中,输 ...

  8. 窥探C语言程序的编译、链接与.h文件

    概述 C语言程序从源文件经过编译.链接生成可执行文件.那么编译与链接分别做了什么? 开发中为什么使用.h编写函数的声明?接下来使用案例说清楚为什么这样编写代码. C语言程序的编译和链接 C语言程序从源 ...

  9. go语言第一问:在其他地方执行编译go语言程序,结果会在哪个地方产生?

    1.我们看执行编译go语言程序中命令,没有找到exe文件.

随机推荐

  1. node.js安装与配置

    node.js是一个基于Chrome V8引擎的javascrit运行环境. node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量又高级. node.js的包管理器npm,是全球最大的开源 ...

  2. CC17:猫狗收容所

    题目 有家动物收容所只收留猫和狗,但有特殊的收养规则,收养人有两种收养方式,第一种为直接收养所有动物中最早进入收容所的,第二种为选择收养的动物类型(猫或狗),并收养该种动物中最早进入收容所的. 给定一 ...

  3. Zeppelin的入门使用系列之使用Zeppelin运行shell命令(二)

    不多说,直接上干货! 前期博客 Zeppelin的入门使用系列之创建新的Notebook(一) 接下来,我将以ml-100k数据集,示范如何使用Spark SQL进行数据分析与数据可视化 因为 [ha ...

  4. dynomite:高可用多数据中心同步

    https://github.com/Netflix/dynomite Dynomite, inspired by Dynamo whitepaper, is a thin, distributed ...

  5. springMVC数据校验与单文件上传

    spring表单标签:    <fr:from/> 渲染表单元素    <fr:input/>输入框组件    <fr:password/>密码框组件标签    & ...

  6. java引用数据类型(类)

    1 引用数据类型分类 类的类型分两种 1)Java提供好的类,如Scanner类,Random类等,这些已存在的类中包含了很多的方法与属性,可供开发者使用.(类的变量是属性) 2)开发者自己创建的类, ...

  7. 上传图片转为blob URL和计算文件大小

    { getFileUrl: function getFileUrl(fileInputId) { var uri = { url: '', filename: '', filetype: '', da ...

  8. <Android 应用 之路> 聚合数据SDK

    聚合数据介绍 聚合数据是一个为智能手机开发者,网站站长,移动设备开发人员及图商提供原始数据API服务的综合性云数据平台.包含手机聚合,网站聚合,LBS聚合三部分,其功能类似于Google APIS.[ ...

  9. RSA加密解密(转)

    RSA加密解密 对于RSA产生的公钥.私钥,我们可以有两种方式可以对信息进行加密解密.私钥加密-公钥解密 和 公钥加密-私钥解密RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest) ...

  10. CRC检错技术原理

    一.题外话 说来惭愧,一开始是考虑写关于CRC检错技术更深层次数学原理的,然而在翻看<Basic Algebra>后,我果断放弃了这种不切实际的想法.个人觉得不是因为本人数学水平差或者能力 ...