剖析编译器

1.可执行程序是如何被组装的

1.1 用gcc生成静态库和动态库.pdf和静态库.a与.so库文件的生成与使用

本次实验,我阅读、理解了“用gcc生成静态库和动态库.pdf”和“静态库.a与.so库文件的生成与使用.pdf”准备在ubuntu中大展身手

首先,进入ubuntu,点击Text
Editor,在其中编译我们需要的程序。

在这里插入图片描述
编译一个文件
在这里插入图片描述
改名为hello.c,放入test文件夹中。在这里插入图片描述
再编译一个程序,编译好后取名为main.c,与hello.h、hello.c一起放入test中
在这里插入图片描述
在控制台输入gcc -c hello.c 编译hello.c
在这里插入图片描述
可以看到hello.c生成了hello.o文件,使用ls命令也可以看到
在这里插入图片描述
3.由.o 文件创建.a静态库在终端中输入指令

ar -crv libmyhello.a hello.o

可以看到生成了静态库
在这里插入图片描述
此时输入以下代码,编译出hello文件

gcc main.c libmyhello.a -o hello

在这里插入图片描述
由.o 文件创建.so动态库文件

代码:gcc -shared -fPIC -o libmyhello.so hello.o

在这里插入图片描述
使用动态库编译
在这里插入图片描述
但是编译程序出错
在这里插入图片描述
经过询问他人,使用mv命令将so文件移动到/usr/lib
在这里插入图片描述
输入 ./hello,程序能够正常运行.
在这里插入图片描述

1.2 静态库入门

首先,先创建一个test1供这个实验使用
在这里插入图片描述
在test1中编译main.c,代码如下

#include"x2x.c"
#include"x2y.c"
#include<stdio.h>
int main()
{
	float x=2;
	float y=3;
	printf("a=%f\n",x2x(x));
	printf("b=%f\n",x2y(x,y));
	return 0;
}

在这里插入图片描述
x2x.文件

#include<stdio.h>
float x2x(float x)
{
	float a;
	a = x * x;
	return (a);
}

在这里插入图片描述
x2y.c文件
在这里插入图片描述
依次编译上述三个文件
在这里插入图片描述
将x2x.o与x2y.o编译为一个.a文件
在这里插入图片描述
使用gcc命令得到最终编译文件

gcc main.c libmy2xy.a -o xy

在这里插入图片描述
运行xy,得到x2x,x2y的最终答案
在这里插入图片描述
使用ls -l,确定xy最终大小为16752B.

创建动态库.so文件
在这里插入图片描述

1.3动态库使用与比较

将main函数与动态库连接

gcc main.c libmytest.so -o xy1

在这里插入图片描述

编译xy1成功,查看其大小,为16752B,与前面一样
在这里插入图片描述

2.gcc编译工具集中各软件的用途,了解EFF文件格式,汇编语言格式

2.1GCC常用命令

先放一张简介
在这里插入图片描述
首先,准备一个最基础的test函数
在这里插入图片描述
使用一行代码直接到位

gcc test.c -o test

在这里插入图片描述
实际上,上述编译过程是分了四步在进行,分别为预处理、编译、汇编、连接

2.1.1预编译

gcc -E test.c -o test.i

在这里插入图片描述

2.1.2编译为汇编代码

gcc -S test.i -o test.s

在这里插入图片描述

2.1.3汇编

gcc -C test.s -o test.o

注意:此时gcc后为-C并非-c
在这里插入图片描述

2.1.4连接

gcc test.o -o test

连接好最终函数后,使用./test即可看到test的输出.
在这里插入图片描述

2.2ubuntu中使用nasm

由于自己的ubuntu中没有nasm,所以直接使用apt安装了nasm

sudo apt install nasm

在这里插入图片描述
创建一个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 hello.asm 编译文件,生成hello.o
在这里插入图片描述
使用ld -s -o hello hello.o生成可执行文件,之后执行文件
在这里插入图片描述
hello的文件大小
在这里插入图片描述
此外随便写了一个hi的函数,运行了一下
在这里插入图片描述
查看一下大小
在这里插入图片描述
跟asm文件差距巨大.

3.如何借助第三方库函数完成代码设计

3.1部分基本光标库

int echo();//用于开启键盘输入字符
int noecho(); //用于关闭键盘输入字符
int cbreak(); //设置cbreak模式,字符一键入,直接传给程序
int nocbreak(); //关闭
int raw(); //关闭特殊字符处理
int noraw(); //同时h恢复默认模式和特殊字符处
int getch();//读取一个字符 int
getstr(char *string);//读取一个字符串

3.2由于本人是windows server版本,所以调整方式与普通版不同

进入控制面板,选择[程序和功能],点击[启用或关闭 Windows 功能],在表盘中找到telnet客户端,勾选后确定
在这里插入图片描述
不过由于server版不太稳定,所以并未实验成功,希望下次能够成功.

3.3用 sudo apt-get install libncurses5-dev 安装curses库

在这里插入图片描述

3.4 用cd命令进入/usr/include,发现curses.h在内

在这里插入图片描述

3.5搞个游戏

在CSDN上找到了贪吃蛇的源码,复制并且编译贪吃蛇文件
在这里插入图片描述
输入./tcs,可以游玩
在这里插入图片描述

4.总结

本次实验,我学到了静态库,动态库的运作以及编译的具体4个过程,包括后面的curses光标库、还访问了几十年前的社区网站,总得来说获益匪浅,希望下次实验能够更加成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值