gcc编译工具

文章目录

  • 一、gcc编译工具
    • (一)GCC
    • (二)Binutils
    • (三)C 运行库
  • 二、EFF文件格式
  • 三、GCC的常用命令
  • 四、as汇编编译器
      • 1、安装nasm
      • 2、创建hello.asm文件并输入代码
      • 3、编译
      • 4、链接
      • 5、运行
  • 五、Linux 系统中的第三方库函数
      • 1、光标库(curses)的主要函数功能
      • 2、几个基本函数名称及功能
      • 3、安装curses库
      • 4、 体验一下即将绝迹的远古时代的 BBS (一个用键盘光标控制的终端程序)
      • 5、用gcc编译生成一个终端游戏

一、gcc编译工具

(一)GCC

GCC(GNU C Compiler)是编译工具。本文所要介绍的将 C/C++语言编写的程序 转换成为处理器能够执行的二进制代码的过程即由编译器完成。

(二)Binutils

1、addr2line:用来将程序地址转换成其所对应的程序源文件及所对应的代码行,也可以得到所对应的函数。帮助调试器在调试的过程中定位对应的源代码位置。

(2) as:主要用于将汇编语言编写的源程序装换成二进制形式的目标代码。

(3) ld:主要用于将多个目标文件连接成为可执行程序,同时指定程序在运行时是如何执行的。

(4) ar:从文件中创建、修改和扩展文件,主要用于创建静态库。

(5) ldd:可以用于查看一个可执行程序依赖的共享库。

(6) objcopy:将一种对象文件翻译成另一种格式,譬如将.bin 转换成.elf、或 者将.elf 转换成.bin 等。

(7) objdump:主要的作用是反汇编。既可以反汇编二进制文件,也可以对对象文件进行反汇编。

(8) readelf:显示有关 ELF 文件的信息。

(9) size:列出可执行文件每个部分的尺寸和总尺寸,代码段、数据段、总大小等。

(三)C 运行库

C 语言标准主要由两部分组成:一部分描述 C 的语法,另一部分描述 C 标准库。 C 标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义,譬如常见的 printf 函数便是一个 C 标准库函数,其原型定义 在 stdio 头文件中。
C 语言标准仅仅定义了 C 标准库函数原型,并没有提供实现。因此,C 语言编译 器通常需要一个 C 运行时库(C Run Time Libray,CRT)的支持。C 运行时库又 常简称为 C 运行库。与 C 语言类似,C++也定义了自己的标准,同时提供相关支 持库,称为 C++运行时库。

二、EFF文件格式

ELF 文件格式如下图所示,位于 ELF Header 和 Section Header Table 之间的都是段(Section)。
gcc编译工具_第1张图片
一个典型的 ELF 文件包含下面几个段:
.text:已编译程序的指令代码段。
.rodata:ro 代表 read only,即只读数据(譬如常数 const)。
.data:已初始化的 C 程序全局变量和静态局部变量。
.bss:未初始化的 C 程序全局变量和静态局部变量。
.debug:调试符号表,调试器用此段的信息帮助调试。

三、GCC的常用命令

-c:把源程序编译为目标代码,生成以同名的.o为后缀名的目标文件。

-S:生成一个后缀名为.s的汇编语言文件。

-e对文件进行预处理,预处理的结果送到标准输出(如显示器)中。

-x language:强制编译器用指定的语言编译器来编译某个源程序。

-o:在默认状态下,在当前目录生成一个名为a.out的可执行程序。

-static:强制程序连接静态库。

-L:特别指定所依赖库所在的路径。

四、as汇编编译器

as汇编编译器针对的是AT&T汇编代码风格,Intel风格的汇编代码则可以用nasm汇编编译器编译生成执行程序。

1、安装nasm

方法一:直接安装

sudo apt install nasm

假如出现以下错误,使用方法二:

gcc编译工具_第2张图片
方法二:
进入nasm官网下载安装包
链接: https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/.
gcc编译工具_第3张图片
然后把压缩包复制到ubantu系统中
gcc编译工具_第4张图片

解压压缩文件

tar -xvf /home/liwenye/nasm-2.14.02.tar.gz

在这里插入图片描述
进入你解压文件的位置

cd /home/liwenye/nasm-2.14.02

在这里插入图片描述

依次运行:

./configure
make
sudo make install

gcc编译工具_第5张图片
安装完成。

2、创建hello.asm文件并输入代码

在这里插入图片描述

; hello.asm 
section .data            ; 数据段声明
        msg db "Hello, world!", 0xA     ; 要输出的字符串
        len equ $ - msg                 ; 字串长度
section .text            ; 代码段声明
global _start            ; 指定入口函数
_start:                  ; 在屏幕上显示一个字符串
        mov edx, len     ; 参数三:字符串长度
        mov ecx, msg     ; 参数二:要显示的字符串
        mov ebx, 1       ; 参数一:文件描述符(stdout) 
        mov eax, 4       ; 系统调用号(sys_write) 
        int 0x80         ; 调用内核功能
                         ; 退出程序
        mov ebx, 0       ; 参数一:退出代码
        mov eax, 1       ; 系统调用号(sys_exit) 
        int 0x80         ; 调用内核功能

3、编译

nasm -f elf64 hello.asm

4、链接

ld -s -o hello hello.o 

5、运行

./hello

查看文件大小:

size hello

在这里插入图片描述
常规使用vi建立hello1.c文档,写入内容并用gcc编译

#include  
int main(void) 
{ 
printf("Hello World!\n"); 
return 0; 
}

在这里插入图片描述
查看大小:
在这里插入图片描述
结论:对比nasm命令生成的文件,明显看出使用nasm 命令生成的可执行文件大小比用gcc命令生成的文件小很多。

五、Linux 系统中的第三方库函数

1、光标库(curses)的主要函数功能

Curses 函数库的名称来自它所提供的功能,它能够优化光标的移动并减少需要对屏幕进行的刷新,因此它也减少了必须向字符终端发送的字符数目。

2、几个基本函数名称及功能

initscr():初始化curses库和ttty,在开始curses编程之前,必须使用initscr()这个函数来开启curses模式。

endwin():关闭curses并重置tty,结束curses编程时,最后调用的一个函数。
move(y,x):将游标移动至 x,y 的位置。

getyx(win,y,x):得到目前游标的位置(请注意!是 y,x 而不是&y,&x
echochar(ch):显示某个字元。

addch(ch):在当前位置画字符ch。

addstr(str):在当前位置画字符串str。

getch() :从键盘读取一个字元。(注意!传回的是整数值)

getstr() :从键盘读取一串字元。

box(win,ch1,ch2): 自动画方框

3、安装curses库

下载想要的ncurses.tar.gz压缩文件
链接: http://ftp.gnu.org/pub/gnu/ncurses/.
gcc编译工具_第6张图片
然后把压缩包复制到ubantu系统中
gcc编译工具_第7张图片

解压:

tar zxvf /home/liwenye/ncurses-6.0.tar.gz

进入你解压文件的位置,依次运行即可安装成功。

cd 
./configure 
make 
sudo make install

这样curses函数库的头文件和库文件就被分别安装在/usr/include/和/usr/lib/下

4、 体验一下即将绝迹的远古时代的 BBS (一个用键盘光标控制的终端程序)

在 win10 系统中,“控制面板”–>“程序”—>“启用或关闭Windows功能”,启用 “telnet client” 和"适用于Linux的Windows子系统"。 然后打开一个cmd命令行窗口,命令行输入 telnet bbs.newsmth.net,即可体验即将绝迹的远古时代的 BBS 。
gcc编译工具_第8张图片

5、用gcc编译生成一个终端游戏

参考 “Linux 环境下C语言编译实现贪吃蛇游戏”
链接: http://www.linuxidc.com/Linux/2011-08/41375.htm.
首先建立一个mysnake1.0文件,粘贴相应内容,使用命令即可体会贪吃蛇游戏。

cc mysnake1.0.c -lcurses -o mysnake1.0
./mysnake1.0

总结:以上是gcc编译工具的相关内容。
参考资料:
1、《嵌入式Linux系统开发教程》
2、curses-百度百科
链接: //baike.baidu.com/item/curses/1630775?fr=aladdin#3.

你可能感兴趣的:(linux)