`
tomotoboy
  • 浏览: 162504 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

gcc编译器入门

阅读更多
Gcc编译流程:
  • 预处理(Pre-Processing);
  • 编译(Compiling);
  • 汇编(Assembling);
  • 链接(Linking);

以intime.c为例讲解:
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <string.h>
#define PROMPT "time is up to 2 seconds\n\a"
char *prompt=PROMPT;
unsigned int len;
void prompt_info(int signo){

 write(STDERR_FILENO,prompt,len);

}

void init_sigaction(void){
 struct sigaction act;
 act.sa_handler = prompt_info;
 act.sa_flags=0;
 sigemptyset(&act.sa_mask);
 sigaction(SIGPROF,&act,NULL);
}

void init_time(){

 struct itimerval value;
 value.it_value.tv_sec =2;
 value.it_value.tv_usec=0;
 value.it_interval=value.it_value;
 setitimer(ITIMER_PROF,&value,NULL);

}

int main(){
 len=strlen(prompt);
 init_sigaction();
 init_time();
 while(1);
 exit(0);
}


1)预编译阶段
在该阶段,编译器将代码中的头文件编译进来,并且用户可以使用Gcc的选项“-E”进行查看,该选项的作用是让Gcc在预编译后停止编译过程。
执行命令:
gcc -E intime.c -o intime.i

下面是部分intime.i的代码:
……
extern char *strsignal(int);
extern int ffs(int);
extern int strcasecmp(const char *, const char *);
extern int strncasecmp(const char *, const char *, size_t);
extern size_t strlcpy(char *, const char *, size_t);
extern size_t strlcat(char *, const char *, size_t);





extern char *strdup(const char *);
# 6 "intime.c" 2

char *prompt="time is up to 2 seconds\n\a";
unsigned int len;
void prompt_info(int signo){

 write(2,prompt,len);

}

void init_sigaction(void){
 struct sigaction act;
 act._funcptr._handler = prompt_info;
 act.sa_flags=0;
 sigemptyset(&act.sa_mask);
 sigaction(29,&act,0);
}

void init_time(){

 struct itimerval value;
 value.it_value.tv_sec =2;
 value.it_value.tv_usec=0;
 value.it_interval=value.it_value;
 setitimer(2,&value,0);

}
int main(){
 len=strlen(prompt);
 init_sigaction();
 init_time();
 while(1);
 exit(0);
}

由此可见,gcc确实进行了预处理,它把“stdio.h”等头文件的内容插入到intime.i中。


2)编译阶段
接下来进行的是编译阶段,在这个阶段中gcc首先检查代码的规范性、语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc把代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,改选项只进行编译而不进行汇编,生成汇编代码。
//home/l/g/tomotoboy/c >gcc -S intime.i -o intime.s

现在让我们来看看intime.s的部分代码
/home/l/g/tomotoboy/c >cat intime.s
        .file   "intime.c"
        .section        .rodata
.LC0:
        .string "time is up to 2 seconds\n\007"
.globl prompt
        .data
        .align 4
        .type   prompt, @object
        .size   prompt, 4
prompt:
        .long   .LC0
        .text
.globl prompt_info
        .type   prompt_info, @function
prompt_info:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        subl    $4, %esp
        pushl   len
        pushl   prompt
        pushl   $2
        call    write
        addl    $16, %esp
        leave
        ret
        .size   prompt_info, .-prompt_info
.globl init_sigaction
……

……
main:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        andl    $-16, %esp
        movl    $0, %eax
        addl    $15, %eax
        addl    $15, %eax
        shrl    $4, %eax
        sall    $4, %eax
……
这也是一个相当长的文件。

3)汇编阶段
汇编阶段是把编译阶段生成的".s"文件转成目标文件,我们使用选项为"-c"就可以了看到汇编代码已转化为".o"结尾的二进制木标代码了,如下:
/home/l/g/tomotoboy/c >gcc -c intime.s -o intime.o
/home/l/g/tomotoboy/c >ls
Makefile     factorial.o  intime.i     intime.s     main.c
factorial.c  intime.c     intime.o     main         main.o


4)链接阶段
在成功编译之后,就进入链接阶段。在这里涉及到一个重要的概念:函数库。函数库一般分为静态和动态库两种。
静态库是指编译链接时,把库文件的代码全部加到可执行文件中,因此生成的文件比较大,但在运行时就不再需要这个文件了。其后缀名一般为".a"。动态链接库与之相反,在编译链接时并没有吧库文件的代码加入到可执行文件中,而在程序执行时由运行时链接文件加载库,这样可以节省系统开销。动态链接库一般为".so"。如libc.so.6就是动态库。gcc在编译时默认使用动态库。
/home/l/g/tomotoboy/c >gcc intime.o -o intime
/home/l/g/tomotoboy/c >ls
Makefile     factorial.o  intime.c     intime.o     main         main.o
factorial.c  intime       intime.i     intime.s     main.c

我运行一下
/home/l/g/tomotoboy/c >intime
time is up to 2 seconds
time is up to 2 seconds
time is up to 2 seconds
time is up to 2 seconds
time is up to 2 seconds
分享到:
评论

相关推荐

    GCC编译器使用入门培训

    【收集帖】小布老师作品:GCC编译器使用入门培训

    GCC编译器使用入门培训1

    GCC编译器使用入门培训1GCC编译器使用入GCC编译器使用入门培训1门培训1

    linux下gcc编译器的简易入门

    介绍了gcc编译器中-o、-c、-Wall等常用选项(参数)的用法,并结合一个实例,详细介绍了gcc编译多个文件生成可执行文件的过程。

    GCC编译器起步

    学习Linux入门级的学习资料。嵌入式课上老师总结的。

    linux下gcc编译器的使用

    linux GCC的入门,相用LINUX敲C++,这个不错!

    linux系统下C编译器GCC入门.docx

    linux系统下C编译器GCC入门.docx

    Ubuntu入门(三) GCC编译器 Makefile基础 Shall编程

    目录1.GCC编译器1.1.VIM设置1.2.编译代码2.Makefile基础2.1.实验程序2.2.Makefile概念和基本操作步骤2.3.Makefile规则格式2.4.Makefile变量2.5.Makefile模式规则&自动化变量2.6.Makefile条件判断3.Shall编程3.1....

    ubuntu下gcc编程入门

    ubuntu下gcc编程入门收藏 准备工作 如果你还没装编译环境或自己不确定装没装,不妨先执行 sudo apt-get install build-essential 如果你需要编译 Fortran 程序,那么还需要安装 gfortran(或 g77) sudo apt-get ...

    GCC中文手册

    GCC 编译器 的使用手册 中文版 全面介绍GCC的入门,进阶,调试.

    An Introduction to GCC.pdf

    An Introduction to GCC.pdf,是介绍GCC编译器的一本入门教材,说得不是很深入,不过对于初学者来说是一本入门的好书!

    Linux之GCC经典入门教程

    GCC 是什么东西,怎么在菜单中找不到? GCC 不能有像 VC 那样的窗口吗?…… 那么你真正想要了解的可能是 anjuta,kdevelop,geany,...即使在这种情况下,由于 GCC 是以上 IDE 的后台的编译器,本文仍值得你稍作了解。

    GCC 入门剖析以及嵌入式汇编

    介绍了linux下的编译器gcc的基本原理,以及嵌入式汇编编译的过程

    Linux下编译器gcc系列教程

    从网上找的关于GCC的使用入门教程,txt格式,希望有用,在这里对原作者致敬

    linux gcc

    linux系统下C编译器GCC入门.有在linux上想学习gcc 的同学们..可以借鉴...学习一些gcc的基本使用方法...

    AVR 程序 供初学者

    AVR 程序 供初学者 GCC 编译器(使用)希望会对初学者有帮助

    详解GCC的下载和安装

    GCC是Linux平台下最常用的编译程序,它是Linux平台编译器的事实标准。同时,在Linux平台下的嵌入式开发领域,GCC也是用得最普遍的一种编译器。本文将告诉读者如何下载并按照GCC。

    AhaC编译器(啊哈C语言编程入门软件)3.0中文免费安装版

    AhaC编译器是一个轻量级超简洁的C语言编程入门软件,专门为小白用户准备的编译软件,让你快速地对软件进行编译,别看他简单,但是该有的功能都有了,适合c语言入门者使用!需要的朋友可以下载! AhaC编译器功能 1...

    Linux 运维 入门到高级

    Linux启动流程 Linux根据端口号查看被占用的服务 升级gcc编译器 自动化运维 安装kickstart文件(半自动化) ANSIBLE部署 企业级OpenVPN 安装OpenVPN 该笔记由刘森飚整理,版权归原作者所有 仅用于学习交流分享,如有...

    C 语言中文网 Java、Swing、设计模式、Python、Golang 等十三本

    'GCC 编译器 30 分钟入门教程(C 语言中文网).epub' 'Go 语言入门教程(C 语言中文网).epub' 'Java Swing 教程:30 分钟玩转 Swing 界面设计(C 语言中文网).epub' 'Java 基础教程(C 语言中文网).epub' 'Java ...

Global site tag (gtag.js) - Google Analytics