gcc的ar工具及as汇编编译器入门练习及curses库
目标
1.ar工具生成1个 .so 动态库文件, 然后用 gcc将 main函数的目标文件与此动态库文件进行链接,生成最终的可执行程序
2.对示例代码“hello.asm”编译生成可执行程序,并与“hello world”C代码的编译生成的程序大小进行对比。
3.用gcc编译生成一个终端游戏,体会curses库如何被链接和使用。
参考资料
GCC编译器背后的故事
静态库.a与.so库文件的生成与使用
用gcc生成静态库和动态库
Linux GCC常用命令
NASM 学习笔记–NASM的安装和使用
一、ar工具使用
1.编写三个函数main.c/sub1.c/sub2.c
sub1.c
float x2x(float a, float b) {
return a * b;
}
sub2.c
float x2y(float a, float b) {
return a / b;
}
main.c
#include<stdio.h>
extern float x2x(float a, float b);
extern float x2y(float a, float b);
int main() {
float a = 2;
float b = 3;
printf("ax2xb=%f\n",x2x(a,b));
printf("ax2yb=%f\n",x2y(a,b));
}
2.将x2x、x2y目标文件用 ar工具生成1个 .a 静态库文件
ein@ein-virtual-machine:~/ein$ gcc -c sub1.c
ein@ein-virtual-machine:~/ein$ gcc -c sub2.c
ein@ein-virtual-machine:~/ein$ ar -crv main.a sub1.o sub2.o
成功生成
3.用 gcc将 main函数的目标文件与此静态库文件进行链接,生成最终的可执行程序
in@ein-virtual-machine:~/ein$ gcc -c main.c
ein@ein-virtual-machine:~/ein$ gcc -o main main.o main.a
ein@ein-virtual-machine:~/ein$ ./main
ax2xb=6.000000
ax2yb=0.666667
成功生成
二、as汇编编译器
1.首先安装nasm
sudo apt install nasm
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 ; 调用内核功能
nasm -f elf64 -o hello.o hello.asm
ld -o hello hello.o
./hello
在此之后又编译了一个相同输出hello world的C程序hello1.c
不难看出,在输出相同的程序下,汇编语言写的程序编译生成的程序要小巧太多
三.Linux 环境下C语言编译实现贪吃蛇游戏
1.curses库
curses库的主要函数及功能参考
Linux下curses函数库
通过搜索发现curses.h文件在usr/include这个文件夹里面
2.远古BBS
打开控制面板
启用 “telnet client” 和"适用于Linux的Windows子系统"
打开一个cmd命令行窗口,命令行输入 telnet bbs.newsmth.net,以游客身份体验一下即将绝迹的远古时代的 BBS
3.Linux 环境下C语言编译实现贪吃蛇游戏
参考资料: Linux
环境下C语言编译实现贪吃蛇游戏
总结
学到了不少GCC相关的知识,加强了对GCC编译的熟练度