一个不需要任何库的可执行文件,甚至不需要libc?


[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文件中。

相关内容

  • 没有找到相关文章

最新更新