作者Aurim (Who cares?)
看板C_Sharp
标题Re: [问题] 为何还有结构存在?
时间Thu Jul 14 19:37:53 2005
不是linker啦,我还linking loader哩,都不是啦。
我们要来正一下名,那个在入程式用的东西在系统程式里就只是叫loader,
附带有目的码连结功能的可以叫做linking loader。如果你喜欢,是可以自
己写一个linking loader,发明自己的执行档格式;我看不出来这样子有什
麽比利用现成的执行档格式要好的优点就是了。我不会说前面有人说错,因
为真的要照着每个人自己说的作法下去硬干还是可以做出会动的东西,只是
有种种利弊得失,所以Microsoft/Borland不是那样做。
顺便回覆前面有人问要看哪些书才能知道这些,我想最根本的原理应该要看
系统程式课程的课本。不过对於这些历史演进,我只是刚好恭逢其盛,从小
玩起,看着底下这些东西一步一步演进。可以参考Turbo Pascal/Turbo C++/
Delphi 1-7的程式语言使用手册,每一个版本都有一章在专门讲Borland实作
这些编译器时,不同变数与资料型态在记忆体中是怎样安排的。然後搭配上
多年的反组译与CPU指令层次追踪程式的经验,就会明白事情是如何了。
盒装的Visual Studio多半没纸印的说明书,即使知道有MSDN可以查,面对
那麽多东西,可能也不知道如何查起。我是没有去查过,只能从自己追踪程
式的经验上来说,VC++跟Borland的C++编译器产品的作法不会差太多。
你要讲6502上Apple DOS 3.3/ProDOS 1.0的程式载入,还是要讲X86上
MSDOS 2.0~7.x,Win16/Win32上的程式载入,我都可以讲,不过这边是C#
讨论区,我不要讲那麽远,上面这堆里头只有.COM的MSDOS执行档是依你说的
那个方式在载入的。在.COM的情形下,那个也不是linker,linker是那个把
一堆编译好後的目的码跟程式库连结成执行档的东西。
课本上有的东西,就不用我多讲了。
※ 引述《virdust2003 (替机壳洗个热水澡)》之铭言:
: 不好意思,我手边没书,但 Load的时候 不是会要到一块长长的记忆体,
: 接下来 Linker 把 Data(一开始宣告好的)、Code从头开始填入,
: 然後 SP 指到最後的位址,
: 这里我是把 那块长长的记忆体称为 Stack,这样有错吗?
: 还是你指的Stack 是另外一个Frame,所以才有差别,
: 可是早期的时候不是只有一个Frame吗?(.com的情况)
: 没想到会在C#版讨论这个^^~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.222.17.194
※ 编辑: Aurim 来自: 61.222.17.194 (07/14 19:39)
1F:推 virdust2003:对,是loader ,我打错 219.91.84.248 07/14