易语言资源网 - 做最全的易语言资源下载社区
精易论坛授权登录

PE编译   [复制链接]

    2021-03-29 20:03:20
    高级教程源码
    易语言资源网
    3703 次浏览
    来源链接


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。

.

感谢阅读



点我下载 (已有 210 次下载)

引用模块





引用支持库


源码文件名 支持库文件名 支持库标识
pe编译新.e 系统核心支持库 5.7 d09f2340818511d396f6aaf844c7e325
特殊功能支持库 3.1 A512548E76954B6E92C21055517615B0
通用对象支持库 2.0 {A068799B-7551-46b9-8CA8-EEF8357AFEA4}
编码转换支持库 2.0 {A0005538-9391-4dd9-B4D6-8EB7B9360F08}


[错误报告]   上一篇:libxl通用zc算法(支持最新版)...     下一篇:自绘分组图标列表框雏形...