1.问题的引出
在程序设计领域,库可以说是一切程序的基础。当今的程序几乎没有一个是从0实现的,或多或少都是建立在已有实现功能模块的基础上,这些可以被程序员使用具有一定功能的代码模块就叫做库。
库的使用方式可粗略分为两种,一是源码级别的使用,二是二进制级别使用。
对于第一种,库的源码对于使用者完全开放,用户不仅可以使用,而且可以理解库的实现原理,甚至可以修改库来扩充功能,总之,源码之前,了无秘密。这种方式的缺点是对于库开发厂商,很难保守自己的知识产权,更别说商业秘密;再就是每次编译程序都需要重新编译库这需要更多的编译连接时间;最后由于人人可以修改,容易导致版本混乱,不便于维系稳定的接口。目前开放源代码的库也有不少,如Qt,GlibC,GTK等等,但大多数不是让用户直接使用源代码,而是提供二进制库的同时附带源代码供用户参考。
对于第二种,库只对用户开放有限的说明,目的是让用户可以使用库,但却不知道库的具体实现。这种库的使用方式,典型的就是提供给用户头文件和.lib二进制文件。头文件通常包含数据结构声明或定义和函数的原型声明以及常量宏定义,而库文件则是实际的数据结构和函数功能实现。(注:对于动态链接的库,只是把链接放到了运行阶段,原理类似)。这种方式下,用户只知道有限的使用信息,对于库的实现对用户是不可见的。这就起到了隐藏实现的作用,对于保护库厂商的知识产权有着良好的支持。毕竟通过逆向工程来分析库的实现是很难的事情。
本文关注的就是能通过第二种使用方式使用的库的实现原理,重点是如何对用户隐藏更多的信息,而不影响其使用。
2.需要隐藏的信息