[成功]又一次自己编译Mono,这次是在Windows上,玩Bundle
作者:V君 发布于:2017-10-30 21:07 Monday 分类:折腾手记
目标 -- 将 .net 应用程序用只用一个 exe 承载, 并极大缩减体积, 且能保证工作正常.
(这次不是针对性的解决问题, 不TL;DR (´∀((☆ミつ
■前言
虽然早早就知道 Mono 可以自行编译独立运行, 就像 unity3d 之类的玩法,
也了解过 bundle 工具可以打包程序集进 exe 内, 还知道 Mono 有个 linker
可以像静态库一样链接 IL 捡出只需要的部分, 缩减程序集体积
(尽管不会推断动态调用--挂掉 -_- ,彻底检查然后设定排除规则即可)
不过却没有尝试把他们串起来用: 先把 IL link 一下, 首次缩减体积
然后 bundle 把依赖的程序集打包到exe里 -- 出来的东西是原生的哟!
意味着可以加压缩壳, upx -9 要不要太爽, 进一步缩小最终 exe 的体积,
-- 真·一个 EXE 带走你全家... (´∀((☆ミつ
■动手尝试
先从安装版开始 mkbundle -- 各种失败...过程略过吧, 不愿再想起.
要不要再试试自己编译?
■自己编译
还是回到 Mono 官方 GitHub 上看看, 发现这回 windows 的 build 变成 pass 了!
再次按照官网教程, 抓回源代码, configure && make,然后没有预期的那么顺利 -- 报错了
error while loading shared libraries: ?: cannot open shared object file: No such file or directory
找不到 DLL ? 你显示个问号啥意思?
咕狗一阵,爆栈上面说用 ldd 和 cygcheck 做依赖检查, 然并暖, 没查出问题
但是跑起来就挂掉, 估计是真·动态加载扑空, 继续咕狗也没有结果...
机智的我拿出诊断大杀器 procmon 可以抓到访问失败的操作, 于是盯着看了.
果不其然, 发现文件名 libgcc_s_seh-1.dll 在环境变量 PATH 里的目录溜了一圈都没找到
先是线程退出, 然后进程退出了. everything 发现这货藏在这里:
cygwin64\usr\x86_64-w64-mingw32\sys-root\mingw\bin
把它加到环境变量就能顺利通过编译~
接下来是在 VS 编译运行时,对应官网教程的x64操作
VS需要安装C++功能以及CLANG2,否则无法编译或执行 mkbundle 出现 ClangC2Version 丢失.
这次总算顺利通过编译.
■开始玩吧!
让我们来找到 mkbundle, 它在源码目录下的 /mcs/class/lib/net_4_x-win32/
启动之前需要设置环境变量,
LINK指定静态库路径
export LINK="/LIBPATH:Mono源码目录/msvc/build/sgen/x64/lib/Release"
然后进入源码目录, 打死我也不信它原来没提供参数设置 include 路径
那就粗暴的用当前路径碾过吧, 进入最终执行~
mkbundle
--deps z:/LoopPlay.exe -o z:/lp.exe
--static -L Mono源码目录/mcs/class/lib/net_4_x-win32
刷一会儿屏之后, exe 就出来辣! 尽管很大块头, 我的有 21MB 但是可以 link 再 upx 嘛.
作成脚本来初始化环境变量就可以了, 本例的文件夹是 mono-src-git, 那么可以写成:
set PATH=%~dp0mono-src-git\mcs\class\lib\net_4_x-win32;%PATH%
set LINK=/LIBPATH:%~dp0mono-src-git/msvc/build/sgen/x64/lib/Release
set I18N=%~dp0mono-src-git\mcs\class\lib\net_4_x-win32
cd /d %~dp0mono-src-git
@cmd
双击之后就可以在弹出的命令行打以下简短的命令来执行:
mkbundle -v --static -L %I18N% --deps z:\cil.exe -o z:\bun.exe
时间关系就先写到这里, 抽空再更新link和压缩壳. (´∀((☆ミつ
更新: x86 以及 IL link 和 upx.
按照官网教程把配置参数改成 x86 之后发现问题少了很多. 比如头文件,比如运行时错误.
IL link 可以工具在 %I18N% 目录找到, 用法有点繁琐.
并且不加排除参数直接link的话, 八成会让程序挂掉或者运行不正常. 用法是:
monolinker.exe -c link -d Z:\ -out z:\linked -a Z:\cli.exe
每个参数都是绝对路径 ←好烦 看来真不是直接用的玩意儿, 得做个界面来调用吧.
-c 的参数还可以是 copy, 出来的文件大一些, 起码能正常跑.
将 link 过的程序集打包成一个 exe 然后直接喂给 upx
加上 -9 最高压缩, 后面跟上exe的绝对路径. 一般能压缩到 30% 左右.
嗯嗯 讲完了. (´∀((☆ミつ
blogger
Google Web Translator
热门日志
随机日志
最新日志
最新评论
- V君
@Quartz:(出现)... - Quartz
怎么不见人了呢... - V君
@Soar:DHCP 协议相... - V君
@Soar:当然是非... - Soar
@V君:谢谢 有空... - Soar
搞一个 1230v3+B85... - V君
@Soar:另外,也可... - V君
@Soar:iscsi服务端... - Soar
难怪这么卡,尤其... - Soar
clone了源码,提示...
分类
存档
- 2024年5月(1)
- 2023年7月(1)
- 2023年5月(1)
- 2022年11月(1)
- 2022年10月(1)
- 2022年9月(1)
- 2022年8月(1)
- 2022年7月(1)
- 2022年6月(1)
- 2022年5月(2)
- 2022年4月(1)
- 2022年3月(1)
- 2022年2月(1)
- 2022年1月(1)
- 2021年12月(1)
- 2021年11月(1)
- 2021年10月(1)
- 2021年9月(1)
- 2021年8月(1)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(1)
- 2021年4月(1)
- 2021年3月(1)
- 2021年2月(1)
- 2021年1月(1)
- 2020年12月(1)
- 2020年11月(1)
- 2020年10月(2)
- 2020年9月(1)
- 2020年8月(1)
- 2020年7月(1)
- 2020年6月(1)
- 2020年5月(1)
- 2020年4月(2)
- 2020年3月(3)
- 2020年2月(1)
- 2020年1月(1)
- 2019年12月(1)
- 2019年11月(1)
- 2019年10月(1)
- 2019年9月(1)
- 2019年8月(2)
- 2019年7月(1)
- 2019年6月(1)
- 2019年5月(1)
- 2019年4月(1)
- 2019年3月(1)
- 2019年2月(1)
- 2019年1月(2)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(3)
- 2018年9月(4)
- 2018年8月(6)
- 2018年7月(4)
- 2018年6月(1)
- 2018年5月(2)
- 2018年4月(2)
- 2018年3月(3)
- 2018年2月(1)
- 2018年1月(1)
- 2017年12月(1)
- 2017年10月(2)
- 2017年9月(1)
- 2017年8月(2)
- 2017年7月(1)
- 2017年6月(5)
- 2017年5月(2)
- 2017年4月(2)
- 2017年3月(3)
- 2017年2月(2)
- 2017年1月(2)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(3)
- 2016年9月(4)
- 2016年8月(2)
- 2016年7月(4)
- 2016年6月(3)
- 2016年5月(1)
- 2016年4月(4)
- 2016年3月(3)
- 2016年2月(1)
- 2016年1月(5)
- 2015年12月(4)
- 2015年11月(5)
- 2015年10月(1)
- 2015年9月(6)
- 2015年8月(4)
- 2015年7月(1)
- 2015年6月(6)
- 2015年5月(3)
- 2015年4月(3)
- 2015年3月(2)
- 2015年2月(1)
- 2015年1月(3)
- 2014年12月(1)
- 2014年11月(1)
- 2014年10月(1)
- 2014年9月(3)
- 2014年8月(1)
- 2014年7月(1)
- 2014年6月(1)
- 2014年5月(3)
- 2014年4月(1)
- 2014年3月(1)
- 2014年2月(2)
- 2014年1月(1)
- 2013年12月(2)
- 2013年11月(2)
- 2013年10月(1)
- 2013年9月(3)
- 2013年8月(14)
- 2013年7月(7)
- 2013年4月(1)
- 2013年3月(4)
- 2013年2月(6)
- 2013年1月(6)
- 2012年12月(8)
- 2012年11月(6)
发表评论: