PE编译是什么,一个语言的编译流程就是从代码编译到汇编,然后整合到相对于系统的格式,PE就是window的格式。 也许,有人会告诉你PE结构,但是从来没有人会告诉你运行原理以及如何利用。 在PE上,可以分为几种大类 1.代码 2.资源 3.导入导出表 4.文件信息 . 在如今,资源和导入表已经弃用,为什么要弃用? 因为资源需要加载才能访问,不仅要调用API,还有其他处理,大大影响访问速度。 而如今都是直接访问指针,因为代码段是可读的,也就是说你把它放到代码段,就能直接用指针访问,这就是集成资源,明白吧。 . 导入表就更要弃用的,大家应该都知道window的dll映射是写时复制的,同样的道理,如果你不是在使用时再加载(仅加载一次)是不是会导致打开速度特别慢? . 资源如何集成? 假如一个资源只被一个子程序引用,那么你就可以整合进这个子程序代码里,因为这样能够让你访问资源的速度最大化,因为执行到这段代码时,你这个资源就可能被放入高速缓存了,当然,这是适合单引用,如果是多引用,可以专门放一个区域,并过滤掉所有重复的常量,资源等等,这会使你的程序体积变得更小。 . 代码的编译规范? 首先,在你对所有子程序编译成汇编后,你需要注意的是,子程序间的调用,也就是CALL,一定要保证它的指针是16的倍数,切记!包括集成资源的指针,静态变量的指针,是一定要对齐16的,如果你不这么做,你的代码执行速度会变慢好几倍!这涉及的原理非常的复杂,我就不再详细解释,你可以亲自测试一下。 比如一个子程序的代码才10字节,这个子程序你把它编译在偏移0的位置,你下一个子程序的代码就得编译在偏移16的位置了,千万不要在意这几个无用的字节,但是它也有用的,比如你这个子程序调用了个“你好”的常量,你是不是可以集成进这6个字节里呢? . 如今,x86就快淘汰了,为什么?因为现在几乎都是使用x64系统,另外,x86程序在x64系统上运行每次调用比较特殊的API都会导致非常的慢,因为系统会切换到x64模式再执行再切换回来,这个切换非常的耗时,这也是什么查询虚拟内存特别快而保留虚拟内存特别慢的原因。 . 也许我告诉你的这些,你找遍全网,也找不到答案,这些是从我的经验和摸索出来的。 . 曾经,我想过做个语言,这是PE编译的来源,但是,这不是一个好想法,因为力量薄弱赶不上时代,更不会有市场,不以盈利为目的才是不正常的,毕竟有谁会闲着无聊呢?编译特别容易,难的是集成库,更别说当今时代的,估计大部分人都懒得打开电脑了把,手机端的编译更是复杂无比,等你会了,也许已经是AI编程时代了。 . 发这份源码的目的,也是希望某天能看到一个易语言 的x64编译器,当然,这涉及的知识非常的多,你还得集成那些库,要想实现高效的编译器,你还得懂得如何利用SSE2和FPU配合进行循环的优化,现在CPU都支持SSE2的,以及如何用动态缓冲编译循环合并的代码。 . 当然,这个源码不是完善的,相当于一个半成品,但是是能够让你放入一段汇编代码就能编译出exe来能正常运行的,这源码里,只是x86的实现,只需要改动几个东西就可以编译成x64模式,因为有x64编译的那个源码我好像没有测试过,放着吃灰好久好久了,所以我没有发那个,你需要查找下PEX64的结构,修改一下几处需要8字节指针的地方就可以,没记错的话应该是导入、导出、代码、重定位的某些RVA。 . 另外,这个源码好像在资源的处理那里有BUG,不知道我有没有修复了,代码、导出、导入、的处理是可行的,重定位有没有问题我不记得了,你可以使用OD、PE查看器对EXE跟踪下,修复问题后再转成X64模式。。 . 希望这篇贴能给那些想给易语言写X64编译的带来帮助,也希望某天能看到易语言X64编译器的出现,当然,你要是免费开 源就更好了 . 还有,没有导入表的exe只会加载ntdll的,也就是说你需要通过ldr获取ntdll的相关函数地址,然后调用再加载其他DLL。 . 感谢阅读
- 1
- 粉丝: 3
- 资源: 938
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助