GCC(GNU C Compiler)是编译工具。本文所要介绍的将 C/C++语言编写的程序 转换成为处理器能够执行的二进制代码的过程即由编译器完成。
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 标准库定义了一组标准头文件,每个头文件中包含一些相关的函数、变量、类型声明和宏定义,譬如常见的 printf 函数便是一个 C 标准库函数,其原型定义 在 stdio 头文件中。
C 语言标准仅仅定义了 C 标准库函数原型,并没有提供实现。因此,C 语言编译 器通常需要一个 C 运行时库(C Run Time Libray,CRT)的支持。C 运行时库又 常简称为 C 运行库。与 C 语言类似,C++也定义了自己的标准,同时提供相关支 持库,称为 C++运行时库。
ELF 文件格式如下图所示,位于 ELF Header 和 Section Header Table 之间的都是段(Section)。
一个典型的 ELF 文件包含下面几个段:
.text:已编译程序的指令代码段。
.rodata:ro 代表 read only,即只读数据(譬如常数 const)。
.data:已初始化的 C 程序全局变量和静态局部变量。
.bss:未初始化的 C 程序全局变量和静态局部变量。
.debug:调试符号表,调试器用此段的信息帮助调试。
-c:把源程序编译为目标代码,生成以同名的.o为后缀名的目标文件。
-S:生成一个后缀名为.s的汇编语言文件。
-e对文件进行预处理,预处理的结果送到标准输出(如显示器)中。
-x language:强制编译器用指定的语言编译器来编译某个源程序。
-o:在默认状态下,在当前目录生成一个名为a.out的可执行程序。
-static:强制程序连接静态库。
-L:特别指定所依赖库所在的路径。
as汇编编译器针对的是AT&T汇编代码风格,Intel风格的汇编代码则可以用nasm汇编编译器编译生成执行程序。
方法一:直接安装
sudo apt install nasm
假如出现以下错误,使用方法二:
方法二:
进入nasm官网下载安装包
链接: https://www.nasm.us/pub/nasm/releasebuilds/2.14.02/.
然后把压缩包复制到ubantu系统中
解压压缩文件
tar -xvf /home/liwenye/nasm-2.14.02.tar.gz
cd /home/liwenye/nasm-2.14.02
依次运行:
./configure
make
sudo make install
; 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 ; 调用内核功能
nasm -f elf64 hello.asm
ld -s -o hello hello.o
./hello
查看文件大小:
size hello
常规使用vi建立hello1.c文档,写入内容并用gcc编译
#include
int main(void)
{
printf("Hello World!\n");
return 0;
}
查看大小:
结论:对比nasm命令生成的文件,明显看出使用nasm 命令生成的可执行文件大小比用gcc命令生成的文件小很多。
Curses 函数库的名称来自它所提供的功能,它能够优化光标的移动并减少需要对屏幕进行的刷新,因此它也减少了必须向字符终端发送的字符数目。
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): 自动画方框
下载想要的ncurses.tar.gz压缩文件
链接: http://ftp.gnu.org/pub/gnu/ncurses/.
然后把压缩包复制到ubantu系统中
解压:
tar zxvf /home/liwenye/ncurses-6.0.tar.gz
进入你解压文件的位置,依次运行即可安装成功。
cd
./configure
make
sudo make install
这样curses函数库的头文件和库文件就被分别安装在/usr/include/和/usr/lib/下
在 win10 系统中,“控制面板”–>“程序”—>“启用或关闭Windows功能”,启用 “telnet client” 和"适用于Linux的Windows子系统"。 然后打开一个cmd命令行窗口,命令行输入 telnet bbs.newsmth.net,即可体验即将绝迹的远古时代的 BBS 。
参考 “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.