开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 7427|回复: 42
收起左侧

[易语言纯源码] 【PE编译】

  [复制链接]
结帖率:33% (2/6)
发表于 2021-3-18 10:36:05 | 显示全部楼层 |阅读模式   广东省广州市
分享源码
界面截图:
是否带模块: 纯源码
备注说明: -
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。
.
感谢阅读
.
pe编译新.e (64.09 KB, 下载次数: 199)

评分

参与人数 10好评 +10 精币 +24 收起 理由
Singularity + 1 + 2 奉上小小红包希望笑纳
fengshou + 1 + 2 支持开源~!感谢分享
冰棍好烫啊 + 1 + 3 支持开源~!感谢分享
易语言资源网 + 1 + 5 支持开源~!感谢分享
zytlj + 1 + 2 支持开源~!感谢分享
FallingSnow + 1 + 3 此处应该有鼓励~
camingo + 1 + 2 这么厉害!必须给个红包鼓励下~
Bszk + 1 + 3 精彩文章希望继续努力
1301ok + 1 很赞同,谢谢!
qq1056123185 + 1 + 2 感谢分享,很给力!~

查看全部评分


本帖被以下淘专辑推荐:

发表于 2023-4-4 18:06:50 | 显示全部楼层   江西省鹰潭市
有点陌生但是还是要下载
回复 支持 反对

使用道具 举报

结帖率:81% (26/32)

签到天数: 1 天

发表于 2022-5-3 19:01:12 | 显示全部楼层   上海市上海市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

发表于 2022-2-26 19:05:01 | 显示全部楼层   广东省佛山市
66666666666666666
回复 支持 反对

使用道具 举报

发表于 2022-2-26 19:04:20 | 显示全部楼层   广东省佛山市
6666666666666666
回复 支持 反对

使用道具 举报

签到天数: 1 天

发表于 2021-5-18 22:06:20 | 显示全部楼层   四川省达州市
感谢阅读感谢阅读
回复 支持 反对

使用道具 举报

结帖率:100% (16/16)

签到天数: 4 天

发表于 2021-4-5 10:52:51 | 显示全部楼层   湖北省黄冈市
很好很强大,感谢楼主~
回复 支持 反对

使用道具 举报

结帖率:33% (2/6)
 楼主| 发表于 2021-4-2 00:49:47 | 显示全部楼层   广东省广州市
漫步青云 发表于 2021-3-31 23:49
我是开发了E64插件的心宇,我研究易编译X64有好几年了,你这个简单来说只是如何组建一个X64的PE程序,但直 ...

代码优化的关键点 就是动态缓冲 和循环的时候使用寄存器作变量,其他的可以说根本不需要优化,直接编译成汇编就行  自己组建PE才能随意控制指针的对齐16,因为大部分链接器不会对齐,这些才是代码效率的关键,比如  一个乘2的代码  你肯定想优化成左移  因为左移相当于乘2  但是你用imul eax,eax,0x2 甚至 lea eax,[eax*2] 根本不会有什么差距  所以说将这些乘2优化成左移  就等于在浪费心思,只要你按规则编译成汇编就行了,你若不信,可以测试这三种方式的时间,40多亿次,多运行几次你就会发现排掉CPU中断占用的时间,压根就没差距。置入代码 ({ 51, 201, 73, 184, 2, 0, 0, 0, 209, 224, 73, 117, 246 })   置入代码 ({ 51, 201, 73, 184, 2, 0, 0, 0, 107, 192, 2, 73, 117, 245 })    置入代码 ({ 51, 201, 73, 184, 2, 0, 0, 0, 141, 4, 0, 73, 117, 245 })
回复 支持 反对

使用道具 举报

结帖率:97% (32/33)
发表于 2021-4-1 09:56:08 | 显示全部楼层   四川省宜宾市

有些深奥。
回复 支持 反对

使用道具 举报

发表于 2021-4-1 00:02:30 | 显示全部楼层   湖南省衡阳市
漫步青云 发表于 2021-3-31 23:49
我是开发了E64插件的心宇,我研究易编译X64有好几年了,你这个简单来说只是如何组建一个X64的PE程序,但直 ...

大牛么么么
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表