提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一.动态库与静态库的使用
1.编写代码
#ifndef HELLO_H
#define HELLO_H
void hello(const char *name);
#endif
#include <stdio.h>
void hello(const char *name)
{printf("Hello %s!\n", name);}
#include "hello.h"
int main()
{
hello("everyone");
return 0;
}
2…o文件的生成
3.静态库文件的生成
使用
4.动态库文件的生成
使用
5.静态库与动态库大小比较
#ifndef x2_H
#define x2_H
int ×2x (int x,int y);
int ×2y (int x,int y);
#endif
~
#include<stdio.h>
#include "x2.h"
int main()
{
int x=2,y=1;
printf( "%d + %d = %d \n",x,y,x2x(×,y));
printf( "%d + %d = %d \n",x,y,x2y(x,y));
return 0;
}
~
#include <stdio.h>
int x2x(int x,int y)
{
int r;
r=X+y;
return r;
}
#include <stdio.h>
int x2y(int x,int y)
{
int r;
r=X+y;
return r;
}
分别转动态库与静态库后比较
静态库
动态库
经过实验发现动态库所占空间比静态库少
二.GCC的运行与nasm使用
1.编写代码
#include <stdio.h>
int main(void)
{
printf("Hello World! \n");
return 0;
}
2.编译
预编译
gcc -E test.c -o test.i 或 gcc -E test.c
编译
gcc -S test.i -o test.s
汇编
gcc -c test.s -o test.o
链接
gcc test.o -o test
3.ELF 文件的段
ELF 文件格式如下图所示,位于 ELF Header 和 Section Header Table 之间的都
是段(Section)。一个典型的 ELF 文件包含下面几个段:
text:已编译程序的指令代码段。 .
rodata:ro 代表 read only,即只读数据(譬如常数 const)。
data:已初始化的 C 程序全局变量和静态局部变量。
bss:未初始化的 C 程序全局变量和静态局部变量。 .
debug:调试符号表,调试器用此段的信息帮助调试。
ELF 文件的反编译
由于 ELF 文件无法被当做普通文本文件打开,如果希望直接查看一个 ELF 文件包
含的指令和数据,需要使用反汇编的方法。
使用 objdump -D 对其进行反汇编
4.安装nasm
输入:sudo apt install nasm
创建hello.asm文件
编译输出
5.和之前文件比较大小
hello
text
三.Linux 中curses的使用
1.安装
在Ubuntu中用 sudo apt-get install libncurses5-dev
2.了解Linux 系统中终端程序最常用的光标库(curses)
(1)initscr(): initscr() 是一般 curses 程式必须先呼叫的函数, 一但这个函数被呼叫之后,系统将根据终端机的形态并启动 curses 模式
(2) endwin(): curses 通常以呼叫 endwin() 来结束程式.endwin() 可用来关闭curses 模式, 或是暂时的跳离 curses 模式
(3)refresh(): refresh() 为curses 最常呼叫的一个函式
(4)move(y,x): 将游标移动至 x,y 的
(5)echochar(ch)/addch(ch):显示某个字元
3.使用BBS
四.总结
经过这次实验让我对程序的编译过程有了进一步了解,也明白了GCC不是一个人在战斗它的背后有许多队友。