编译器的故事

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


一.动态库与静态库的使用

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不是一个人在战斗它的背后有许多队友。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值