操作系统前传第五课/嵌入式C语言编译器

本文学习自狄泰软件学院 唐佐林老师的 操作系统课程,另外本文PPT全部来源于唐佐林老师课程PPT,只用于个人笔记学习


目录:

  • 1 GCC与gcc
  • 2 交叉编译
  • 3 C语言编译器
  • 4 多语言混合开发方式
  • 5 gcc关键编译选项

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
我们平时所说的编译器,其实包含了这几个部分,广义上的编译器包含了如上四个部分,其中的编译器部分是我们所说的狭义的编译器。我们要分清广义编译器和狭义编译器。
比如说:“这个代码,我们要考虑可移植性,如果把他移植到其他的编译器上面,是不是还能够正常运行”,这里所说的编译器 就是广义编译器。而如果这么说“我想开发一款编译器,这款编译器可将D语言翻译成C语言”,这里所说的编译器就是狭义的编译器了,狭义的编译只是做翻译的工作。

编译的过程:
在这里插入图片描述

第一步:是预处理,进行简单的文本替换,
第二步:狭义编译器,将C语言的代码 翻译成 汇编语言代码
第三步:汇编器,将汇编语言翻译成机器语言。

如何理解 “多语言混合开发” ?

多语言混合开发思维是一个架构师必备的思维,面对一个项目,该如何更高效的完成。这里说的高效分为两个部分,第一部分是,如何更高效的开发,第二部分是最终的产品执行效率的高效。对于第一部分,高效的开发,需要考虑很多问题,比如,这个项目是不是只用一种语言开发,只用一种语言,可能够是够,但是很低效,那么是不是把多种语言的优点结合起来,可以更高效的开发一个项目呢?这就是语言混合开发的本质了。

多语言混合开发方式一

在这里插入图片描述
在这里插入图片描述
将这三种语言所编写出来的程序进行编译,编译出来的是相同的目标平台的汇编程序,那这样就是
不同语言所编写的程序,在编译之后,得到的是相同的目标平台的汇编程序了,进而的 我们可以
目标平台的汇编器,再来汇编一下,可执行程序就出来了。

**问题:**这种开发方式有什么好处?
**答案:**节省人力成本。不同的语言的人力成本不一样,可以用便宜的语言人力,最后得到的都是目标
平台的汇编程序,效果一样。

多语言混合开发方式二

在这里插入图片描述

这种方式依赖于库,最终选择二进制层面的兼容。

问题: 两种方式有何异同?
答案: 方式一是 将多种语言翻译到目标平台的汇编语言,最后用汇编器汇编成可执行程序。方式1 的做法是从语言到语言。将不同的语言翻译成汇编语言,最后用汇编器汇编成可执行程序。方式二是利用二进制层面的兼容,比如第一种语言 已经编译得到了可执行程序了,是一个二进制程序,最后做的是链接就可以了。两种方式发差别是 第一种是从语言到语言,方法2是二进制代码层面的兼容。

如:QQ
在这里插入图片描述
依赖了一些库,二进制文件,最后链接。就是二进制层面的兼容。

在这里插入图片描述

gcc关键编译选项
gcc关键编译选项一

gcc -E test.c -o test.i
gcc -S test.i -o test.s
gcc -C test.s -o test.o

实验1:

test.c

#include <stdio.h>
#include "func.h"

int g_global = 0;
int g_test = 1;

int main(int argc, char *argv[])
{
    func();
    
    printf("&g_global = %p\n", &g_global);
    printf("&g_test = %p\n", &g_test);
    printf("&func = %p\n", &func);
    printf("&main = %p\n", &main);
	
    return 0;
}

func.h

#include <stdio.h>

void func()
{
#ifdef TEST
    printf("TEST = %s\n", TEST);
#endif

    return;
}

在 ubuntu 中,一次执行指令:

将test.c行进预处理,生成预处理文件 test.i
gcc -E test.c -o test.i

将预处理文件test.i 进行汇编,翻译成汇编程序
gcc -S test.i -o test.s

将汇编程序汇编成机器语言
gcc -C test.s -o test.o

在这里插入图片描述

在映射文件中可以找到 变量以及函数的地址。

在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Linux老A

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值