编译文件的各种LIB文件分析
玩计算机的都知道,计算机执行的是机器指令。
机器指令是手工输入的,后来有了汇编语言。
汇编语言很是方便,加了很多辅助符号帮助人们使用机器指令。
很多重复的指令功能,就用宏和函数过程来反复使用。
后来就有了C语言。C++,Delphi/Pascal,Fortan,BASIC,可以编译成机器指令码的编译语言。
程序越来越多,越来越大,各种函数就集中起来了,就有了各种打包的库文件然后加上引用库文件的说明文件。
单独成一个系统的库包就成为了一个开发包。单独使用。
Linux 的动态库以 .so结尾,静态库为.a,单个函数文件为.o结尾。
DOS下的库文件为.lib,函数动态库程序自定义。
windows 下的动态库文件结尾为.dll,静态库为.lib
因为这些高级语言各有各的个性,所以为了通用这些库就形成了各种约定。
常见的约定是 C约定 clec,C++约定,pascal约定,stdcall 约定
c,pascal,stdcall,约定的区别就是函数调用的进入函数和出函数参数的进栈先后顺序和返回方式
c++约定就是库中函数名的定义方式,用来识别同一功能的名称一样的不同函数
windows的动态链接库在静态同名的函数前面加有"__imp__"。
系统核心函数c调用会在函数名前加"_"。
C++调用区分大小写,特定的文件名方式用link识别
在c语言中的printf 函数 ,这函数文件头是 stdio.h 库是 libc,stdlib (标准C)
printf函数在库中的符号会是_printf,_imp_printf,_printf@4,_printf@xyz@4(注@4表示参数为4字节,XYZ是类型匹配)
extren "C"{} 会使用 _printf和printf, C++会使用 __imp__printf,和_printf@xyz@4, 常见的“_IMP_"宏,"PASCALL"宏
高级语的宏会乱定义,系统点的加"_",有的加"__",实际是一个函数,一个宏,我们要统一宏。
加入库函数有几种方式,一个是直接加到程序文件内部,一种是在文件外部,还有一种是系统已经加载。
这几种方式都在内存中运行。放在内存的地址和方式有关。
管理库文件的程序有很多,常见的有TLIB,LIB,POLIB,Golib,GNU nm公司有布兰公司,微软公司,和WATCOM公司还有一些社会组织个人。
各个版本识别的库不一样,高版本的兼容低版本的lib程序。但是有些库会显示不全。这一直是个问题。
好用的库管理程序为nm,和微软高版本的lib,和watcom公司的lib,参数不同,显示的信息也不一样。不常见的是watcom的lib和Tlib。
有些链接器链接库链接不上,其中之一是链接器功能缺陷。我们可以用lib /export:函数名 库文件(包含函数名)导出成 obj文件,
然后加到程序中去。lib /list 库文件,可以看库函数列表。
计算机已经到64位了,函数库文件更是复杂。系统管理好各个函数也是难上加难。
16位库函数,32位库函数,64位函数不能混用。动态库,如果不包含动态库文件,程序执行不了,静态库还要看运行环境。
引用库文件的包含文件也在统一之中,个人认为统一很麻烦。不喜欢各种混杂定义,一直崇尚简单。不过自己的也很乱,主要是自己方便。
题外话,解释型的语言就不谈了,混淆源码可以保护自己健康成长。反正是慢速执行,不要求时间。
那个.net C#和流行的adobe公司的Photoshop系列软件,好大呀,各种不要的相同的语言模块都塞进了程序。
反复刷新内存,一个函数可以塞在程序中好多副本。然后那些动态链接的DLL库做一些不相干的事或者一个个排成”尸体“。
还有微软件的VS STUDIO,东西真多,一个个又有名气,又齐全。还好,我来者不抗拒。这个软件就是”把“。
实际上个人实用就是一丁点,一丁点。”太监“个人版还是不错的。大耙耙只能用来学习。抗议所有大型软件!