[root@ gwan]# file gwan
gwan: ELF 32-bit LSB executable, Intel 80386, version 1 (GNU/Linux), statically linked, stripped
[root@ gwan]# ldd gwan
not a dynamic executable
[root@ gwan]# du -csh gwan
208K gwan
208K total
关是怎么变魔术的?
作为一个web服务器,它需要做套接字编程和许多其他繁重的工作,这些工作都需要与libc链接,但gwan似乎不是这样。这怎么可能呢?
像往常一样,这不是魔法,GWAN与UPX一起打包以看起来更小,节省约200kB。拆包结果如下:
> ldd gwan
linux-gate.so.1 => (0xf770c000)
libpthread.so.0 => /usr/lib32/libpthread.so.0 (0xf76e9000)
librt.so.1 => /usr/lib32/librt.so.1 (0xf76e0000)
libdl.so.2 => /usr/lib32/libdl.so.2 (0xf76db000)
libm.so.6 => /usr/lib32/libm.so.6 (0xf76b1000)
libgcc_s.so.1 => /usr/lib32/libgcc_s.so.1 (0xf7695000)
libc.so.6 => /usr/lib32/libc.so.6 (0xf752c000)
/lib/ld-linux.so.2 (0xf770d000)
正如它在file
输出中所说的,它是静态链接的——也就是说,它从库中取出所有相关代码并包含在可执行文件中。这是"硬编码"。
Nginx
- 0原生脚本语言生成动态内容
- 没有扩展的本地API
-
2.7 MB
足迹
G-WAN
- 5种本地脚本语言生成动态内容
- 丰富的原生API (JSON, GIF I/O, KV存储,2D帧缓冲原语,图表,电子邮件,压缩,加密等)
-
< 1 MB
足迹
"魔力"存在的地方似乎是一个品味问题,而不是一个理性问题。
考虑到其他应用服务器的占用空间——它们中的大多数只支持一种脚本语言——看到G-WAN (150kB)支持C、c++、Objective-C、D和Java,肯定有一些"魔力"。
G-WAN和Linux 64位OpenJDK/SUN_JVM只占用20 mB的RAM, 在之后加载所有的应用程序示例。
他们显然密切关注内存使用情况,因为内存占用在启动时记录在gwan.log文件中。