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光标库、还访问了几十年前的社区网站,总得来说获益匪浅,希望下次实验能够更加成功!