项目组借用了一台小机, 比较老, 跑的还是HP-UX 11.00, yaw中看到配置是
2*750Mhz cpus, 1.5G mem, 先凑合着用了.
装好了 aCC 和 gcc 后, 照惯例先编译自己常用的一些工具, 在编译 lsof 时发现了一个以前没注意的问题, 这促使我编写了这个我称之为 elfs (ELF64 Stripper) 的工具.
问题是这样的:
1) HP-UX 11.00下 lsof 是 kmem-based 的, 故必须编译成64位;
2) HP-UX 下64位执行文件不再是 SOM 结构, 而是 ELF64 结构;
3) ELF64 结构里包含了一些对程序执行无用, 仅仅是注释用的section, 比如说有一个 .note 的section;
4) 我是用 aCC 来编译 lsof 的, 结果发现在产生的目标文件中就包含有这个叫 .note 的section;
5) 讨厌的事情是: aCC 在这个叫 .note 的section里放的居然是用来产生目标文件的全部源文件信息, 如修改时间/编译时间/最后连接时间, 最可恨的是, 还有全路径名! 也许 aCC 的设计者认为这样对日后程序出问题时定位错误有帮助(强烈怀疑中...), 但显然这暴露了编译者的目录结构和相应的使用习惯(隐私泄漏?), 而且无端地增大了执行文件的尺寸(不幸的是有一定偏执倾向的我很在意这个);
6) 在 man aCC 和 man ld 没有找到"合法"的剔除这些信息的途径后(在此恳请达人不吝赐教), 我决定自己写一个小工具来做掉它:)
于是 elfs 就这样出现了, 经过它处理后我用 aCC 编译的 lsof 从 198536 减小到了 176856, 更重要的是我的个人信息最大可能(?)地从中剔除了:)
在编程中发现存在更"过份"的方式来进一步减小尺寸, 但将破坏 ELF 文件的完备性和一致性, 尽管不影响程序的运行, 但会导致某些依赖其的工具不能正常工作, 如 bintuils 中的 readelf/elfdump/strip 等, 而这显然也是不能被我接受的.
没什么大用, 也或者早有了类似甚至更强的工具可以达到相同的目的, 如果这样(几乎可以肯定是这样^_^), 就当是一次小小的练习:)
OK, 介绍完毕, 有兴趣的朋友这里下载: