9.2 编译器和库签名
DOS 操作系统不提供共享库的方法,因此库例程被连接到程序的映像。由于这个原因,我们为几个编译器生成编译器和库的签名;第 9.3.1 节解释它们如何在 dcc 中使用。
一个自动的签名生成器被编写来为标准.lib 文件生成库签名,详见第 8 章第 8.2.1 节的描述。签名的长度被设定为 23 字节,实验结果证明这个值是一个合理大小。通配符字节是 F4 (是 HALT 指令的操作码),因为这个操作码极少被用,而填充字节被设定为 00。下列 C 语言编译器生成了库签名:Microsoft C 5.1,Microsoft Visual C++ V1.00,Turbo C 2.01,和 Borland C V3.0。为编译器厂商、存储器模型和编译器版本的每一个三元组合生成一个单独的库签名文件。签名在几秒钟之内被生成。
由于使用自动的签名生成,所以发现有重复的签名。重复的数目从最低 Turbo C 2.01 的 5.3%,到最高 Microsoft Visual C++ V1.00 的 29.7%不等。在 Turbo C 2.01 的情况,在 357 个例程中有 19 重复的签名。主要原因是因为有同一表现的例程有不同的名字,比如 spawnvp, spawnvpe, spawnve, spawnv, spawnlp, 和 spawnl。少数签名的相同是由于相似的函数,比如 tolower 和 toupper。只有一对不相关的函数有相同的签名;它们是 brk 和 atoi。在 Microsoft Visual C++ V1.00 的情况,在 1327 例程中有 440 个相同的签名。其中大多数重复是由于用户不能访问的内部公共名字,比如_CIcosh 和_CIfabs。其它一些重复的签名是因为不同的名字被相同例程使用,尤其是为了不同的存储器模型使用的命名约定 (即,相同例程工作在不同的存储器模型中) [Emm94]。
Pascal 语言编译器不使用标准的库文件。在 Borland Pascal 语言编译器的情况,所有的库信息被储存在一个.tpl 文件,其中有关于库例程和原型的信息。一个修改的签名生成器用于.tpl 文件,而且为 Turbo Pascal 4.0 版和 5.0 版生成了签名。
库签名文件平均占用 50Kb 磁盘空间,相对其中储存的库例程信息量来说这个尺寸是适中的。
用于上述编译器的编译器签名是手工生成的而且作为 dcc 的一部分被储存。在语法分析器第一次被调用的时候检查这些签名。签名生成器和原型生成器的实现归功于 Michael Van Emmerik 在昆士兰技术大学工作的时候。这个成果在[Emm94]中详述。
9.2.1 库原型
编写了一个名叫 parsehdr 的程序用来解析 C 语言库的头文件,抽出原型,而且把关于参数类型和返回类型的信息储存到一个文件。生成的原型适用于 C 语言标准库。
至于 Pascal 语言,原型信息是作为.tpl 库文件的组成部分储存的。由于缺乏该原型信息准确结构的有关资料,没有生成这些原型。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论