首页
社区
课程
招聘
根据《编译原理》做出来的编译器,貌似最多只能做到目标代码程度,要想链接出机器代码,好像实现不了。是这样吗?
发表于: 2013-4-9 12:18 16410

根据《编译原理》做出来的编译器,貌似最多只能做到目标代码程度,要想链接出机器代码,好像实现不了。是这样吗?

2013-4-9 12:18
16410
貌似我问的是计算机领域的核心机密之一,所有的编译书籍,都没有弄出机器代码的内容,就连得出目标代码也只是水中望月。

或者是不是说从目标代码链接出机器代码,超出编译原理之类书籍的范围?

难道要弄个得出机器代码的编译连接器,这么玄难吗?

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (30)
雪    币: 190
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
貌似要火,顶贴,同问
2013-4-9 12:31
0
雪    币: 351
活跃值: (80)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
3
这个要涉及OS相关的吧。。。可以看下  程序员的自我修养 http://baike.baidu.com/view/3122513.htm
2013-4-9 12:45
0
雪    币: 962
活跃值: (1681)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
因为连接器和操作系统相关,不同的操作系统结构不同
目标代码,已经是机器码了,只要按照系统指定的格式组装即可,比如linux的elf,win的pe
2013-4-9 13:12
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
关键是,如果有人并不知道如何组装,希望得到指导,无从了解相关知识。

我对这部分完全不知道,所以,对你说的并不理解也不认同。PE格式我略知一二,但如何就能组装?这个好像还是水晶一样的透明体,不知其中玄妙。
2013-4-9 13:24
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我好好看看再说。谢谢。
2013-4-9 13:34
0
雪    币: 962
活跃值: (1681)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
比如mscoff格式的obj,obj中也有重定位,要求导入的符号,导出的符号,和pe格式区别不大啊
不过里面麻烦的东西很多
真想学习这个的可以去看开源的编译器代码,比如GCC和LLVM,大部分编译器都是直接生成obj,再用ms的link连接的
还有一个非成品
http://alink.sourceforge.net/
2013-4-9 14:27
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
8
可以的,我做过!
C语言开发,在DOS编译我的编译器,然后我的编译器可以裸奔在硬件上,编译出来的可执行文件也可以裸奔,连DOS都不用。

词法分析,语法分析,转汇编,汇编
2013-4-9 14:27
0
雪    币: 90
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
虽不晓,但觉吊~~~
2013-4-9 15:29
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
愿闻其详!!!
2013-4-9 19:20
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我的问题焦点在于:如果是各种中间代码,都是程序能产生实现的,不过就是各种文件格式的数据读写而已。可纯二进制的机器代码,我自己怎么生成啊?那不成了我要自己写程序把目标代码变成二进制机器码!?我不知道怎么弄。而各种编译原理书籍也就弄到目标代码,那玩意儿也就是某种程度的伪代码而已,距离纯二进制机器码还差得远了。

我理解错了?
2013-4-9 19:39
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
是不是这样的,我理解错了。

实际上操作系统如windows、dos、linux等其实是我们通常认为的程序的容器,也就是说运行在这些操作系统之上的任何程序,其实都不是真正的二进制机器码,而是某种操作系统来解释执行的中间代码。如果这样解释的话,那么如PE文件之流的不完全二进制机器码的可执行文件就可以解释了。

是这样吗?所以,我们现在所说的链接,其实就是链接成这种中间码而已。只有操作系统本身的底层才是二进制机器码!

对不?如果是这样的话,那么这个链接其实就没那么难如登天了。
2013-4-9 19:54
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
错,pe之类都是完全的x86的二进制指令执行的。而其中所有的代码,有些功能不需要你自己去编写,操作系统都已经写好了,你只要call xxxx 然后操作系统执行功能然后返回,你继续执行你自己的代码。如果你不嫌麻烦,你可以完全不调用操作系统的api,所有代码全部自己编写。当然,理想状态是那样,现实情况不是那样,现实是很多功能是操作系统封装好了,而且由操作系统统一指挥调度,就象交通警察,你能使用的所有机器上面的硬件资源被操作系统限制了,只能通过调用系统api来实现。在dos时代,你就可以完全不使用dos调用,每一个io端口都自己编程序,而保护模式下,硬件特权级别限制了ring3不能执行io端口指令。
2013-4-9 20:44
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
你说的中间代码,是有一些高级语言采用,比如java,c#等等。
2013-4-9 20:47
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
你用UltraEdit随便打开一个windows下的exe看看,PE格式并不是你说的那么纯粹的。也许是我学艺不精,但就我这眼下的粗浅层度来说是不认同阁下说法的。
2013-4-9 20:48
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
链接程序ms已经写好了link.exe,你非要自己写一个链接程序,仔细看一遍pe格式细节,完全按照要求进行输出exe就可以了。如果你愿意,可以自己生成自己的中间文件,不按obj的要求也可以,如果要生成目标文件obj,就需要查看obj的文档,了解obj格式。
2013-4-9 20:50
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
OBJ文件也是中间代码构成的文件。
2013-4-9 20:50
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
PE文件不是从第一个字节到最后一个字节每个都是x86指令,pe文件是有格式的,你查看它的详细格式吧,我一句话也讲不清楚,PE分很多段,只有代码段才是x86指令。
2013-4-9 20:52
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
你牛逼,我对这些文件并不是多精通。否则也不会问了。
2013-4-9 20:52
0
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
obj不是中间代码,是完完全全的x86二进制代码和一些数据结构的组合,pe也是可执行代码外加一些帮助整个程序顺利执行的数据结构,你需要具体去了解pe可执行文件的结构。
2013-4-9 20:53
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
所以,我说PE文件也是中间代码,用来被操作系统容器解析执行的。
2013-4-9 20:54
0
雪    币: 213
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
如果OBJ是最终机器码,那还链接干啥?直接用得了?所以我不认同你的说法。

不过我不想争了。反正我学艺不精,自己去看几位提到的书了。等若干时间之后再说吧。
2013-4-9 20:59
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
首先你要搞清楚,一般说中间代码都是指这样的代码不能被CPU直接执行,需要再次进行处理

在x86 windows平台上,obj里面已经是x86机器码,也就是最终代码

而obj和pe的区别就在于一个pe文件可能是由多个obj链接而成,这样obj就需要额外的数据来将函数和变量在链接时进行对接,pe文件自然就不需要这些东西.但是pe文件又是由os载入,它也需要一些额外的数据来通知os这个文件的属性(比如subsystem),这些也是obj中不存在的,因为obj与具体平台无关,只是一个机器码的载体

举个栗子
麦当劳的薯条是装在一个大塑料袋里,塑料袋上面有保质期重量这些麦当劳需要知道的信息
麦当劳卖你薯条是装在一个小纸盒里,纸盒上面有营养成分这些你需要知道的信息
但是薯条无论在塑料袋还是在纸盒里都是薯条

好好理解编译器和coff&pe结构吧
2013-4-9 22:50
0
雪    币: 21
活跃值: (269)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
编译生成何种代码由你来决定,而现在的PE文件也不只包含纯粹的机器指令了,比如.net模块也是pe格式,但程序代码是IL,需要由.net核心解释成x86机器指令
2013-5-1 16:11
0
雪    币: 141
活跃值: (318)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
不是有两本编译原理
这两个书,一本被称为龙书,和虎书。
原来是3大经典,没想到还有一本鲸书。
不是说看完虎书就可以实现一个简单的编译器?
反正我还没看完,还得翻译还得看。。
2013-5-1 16:24
0
游客
登录 | 注册 方可回帖
返回
//