惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
AI
AI
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
U
Unit 42
Vercel News
Vercel News
Stack Overflow Blog
Stack Overflow Blog
P
Proofpoint News Feed
Microsoft Security Blog
Microsoft Security Blog
The GitHub Blog
The GitHub Blog
WordPress大学
WordPress大学
Martin Fowler
Martin Fowler
博客园 - 【当耐特】
B
Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
F
Full Disclosure
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
H
Help Net Security
Recorded Future
Recorded Future
N
News and Events Feed by Topic
雷峰网
雷峰网
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
aimingoo的专栏
aimingoo的专栏
S
Schneier on Security
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
O
OpenAI News
Project Zero
Project Zero
罗磊的独立博客
G
GRAHAM CLULEY
腾讯CDC
P
Privacy International News Feed
V
V2EX
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Hugging Face - Blog
Hugging Face - Blog
爱范儿
爱范儿
H
Heimdal Security Blog
L
LINUX DO - 热门话题
Forbes - Security
Forbes - Security
美团技术团队
MongoDB | Blog
MongoDB | Blog
Security Latest
Security Latest
M
MIT News - Artificial intelligence
T
Tor Project blog
Cisco Talos Blog
Cisco Talos Blog
宝玉的分享
宝玉的分享
T
Threat Research - Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog

Xiaoxia[PG]

nginx的proxy_pass使用https(SSL加密) | Xiaoxia[PG] Python里使用zbar识别二维码 | Xiaoxia[PG] CentOS7上MySQL返回Too many connections | Xiaoxia[PG] 发现一个不需要打密码的sudo方法 | Xiaoxia[PG] Windows上最小的Python运行环境,700KB | Xiaoxia[PG] 无聊开始玩路由器,入门Tomato固件 | Xiaoxia[PG] Python与简单网络爬虫的编写 | Xiaoxia[PG] 2012年的中秋节 | Xiaoxia[PG] 悬疑 微电影《生日快乐》/ Once Again | Xiaoxia[PG]
继续玩路由器,交叉编译Python 3.3,压成1.5MB | Xiaoxia[PG]
作者是Xiaoxia。 · 2013-09-13 · via Xiaoxia[PG]

昨天在研究如何在嵌入式Linux上搭建Python运行环境,因为有了Python之后,很多工具例如GoAgent之类的东西就可以用上场了。昨天成功编译了Python2.6,参考了网上很多方法,但最后无果而终,现在总结了一套自己的编译方法,基本上可以秒杀所有Python版本的交叉编译,这里做一个总结。我的编译环境是Debian64位 无桌面版本,体积很小巧,安装在办公室电脑虚拟机里,在家里也可以远程编译代码。

首先在Python网站下载最新版源代码,这里我使用Python 3.3版本。解压下,有下面这堆东西。

download

接着,编辑Modules/Setup.dist,把需要用到的模块,去掉注释。

因为我打算把_socket,math,time,md5,sha1,select等模块静态编译进去(这样就不用lib-dynload里的一堆so文件都可以使用那些功能了)。

shared

为了支持中文的decode和encode,下面两个模块也要编译进去。

cncodecs

如果你把zlib去掉了注释,要先交叉编译zlib,把编译出来的两个头文件和一个libz.a放到/usr/local/或者其他编译器能够发现的地方。

下面在configure之前,需要做一些小动作,不然会提示出错。

root@dev:~/Python-3.3.2# echo ac_cv_file__dev_ptmx=no > config.site
root@dev:~/Python-3.3.2# echo ac_cv_file__dev_ptc=no >> config.site
root@dev:~/Python-3.3.2# export CONFIG_SITE=config.site
root@dev:~/Python-3.3.2# ./configure CC=mipsel-linux-gcc CXX=mipsel-linux-g++ AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib –host=mipsel-linux –build=mipsel –disable-ipv6

我的交叉编译工具是mipsel-linux-*。如无意外,运行完毕应该得到Makefile文件。

编辑Makefile,在CONFIGURE_LDFLAGS后面添加 -s -static 两个选项。

下一步,开始编译。

root@dev:~/Python-3.3.2# make python

如无意外,当前目录下就可以得到python。因为我前面忘了加-s参数,所以编译出来体积有点大。可以使用strip工具去掉调试信息和一些不必要的内容,不影响运行。

makepython

strip之后,文件大小从8MB变为3MB。不过还是蛮大的,试试使用UPX压缩一下。工具下载:http://upx.sourceforge.net/

UPX之后,文件大小为 1 MB。对程序运行效率会有影响,不过只在启动的时候有影响,不会影响正常解释脚本的速度 😀

upx

使用scp或者ftp复制该文件到路由器上,看看能否执行。

python3

可以正确显示版本号,不过无法进入命令行,提示缺少encodings,那是因为还没有把Python的Lib复制过来。如果是Python2.x的版本,在这里已经可以运行使用了。所以,剩下只需要把要用到的标准库文件都复制过来就行了。

复制一份Lib目录,然后把不要的库像tkinter的全部删掉,encodings下除gbk和utf8以外的其它编码也不需要。

lib

剩下5MB大小。复制到路由的对应目录下,比如说 /tmp/root/python/lib/python3.3,同时设置 export PYTHONHOME=/tmp/root/python。

再尝试运行,发现缺少 _sysconfiguredata.py 文件,这个文件在Modules里应该能找到,或者别的地方,把它复制过来,放到标准库目录下就OK。

runpy3

因为标准库有5MB那么大,不是很方便写到Flash上,所以可以考虑把标准库压缩成一个Zip文件。

在python3.3目录下,使用批处理把所有py扩展名,通过 python3 -m py_compile *.c 编译成pyc文件,然后删除原来的py文件,接着执行

zip -9r python33.zip *

得到的文件大小为1MB。(我的python2.6的大小是500KB)。然后复制python33.zip到 /tmp/root/python/lib/python33.zip。就可以使用了。

其实,像 pyinstaller和py2exe这类压缩工具,也是用了同样的方法,而我这里是打包python运行环境到嵌入式Linux上。

比较一下 Python2.6 和 Python3.3 的在路由器上的体积。

Python2.6:   不带库 800KB,带基本标准库 1.3MB
Python3.3:不带库 1MB,带基本标准库 2.1MB

个人比较喜欢Python2.6的版本,因为不论是体积还是运行速度,都好很多。配合100KB的 bottlepy 网页开发框架,编写了一个简单的页面。

finish