如何清除NASM与ld编译汇编程序生成的可执行文件中的无用字符串常量
清除无用信息的方法
以下方法按操作复杂度从低到高排列:
方法1:链接后直接剥离元数据
使用binutils自带的strip工具直接移除所有无关的符号、节名、源文件名信息,操作最简单:
strip --strip-all hello_world
执行后你提到的hello_world_32.s、.text、.rodata等字符串都会被完全清除,程序功能不受任何影响,体积可缩小一半以上。
方法2:链接阶段直接生成无冗余的可执行文件
在ld链接时添加参数,直接避免生成无用元数据,不需要后续处理:
ld --nmagic -m elf_i386 --strip-all --omit-section-headers -o hello_world hello_world.o
相关参数作用:
--strip-all:链接时直接不生成符号表、字符串表、调试信息等非运行必须的内容--omit-section-headers:移除节头表,Linux运行ELF程序仅依赖程序头表,节头表完全是为了调试/逆向准备的,移除后可再减少几十字节体积
极致体积优化可选操作
如果目标是生成尽可能小的可执行文件,还可以修改汇编代码进一步压缩:
- 取消
.rodata段定义,将字符串常量直接写入.text段,减少段数量,避免段对齐带来的空间浪费 - 优化指令长度,比如用
mov bl, 1替代mov ebx, 1、用xor eax,eax后inc al替代mov eax,1这类短指令实现相同逻辑 - 极致玩法可以手动构造ELF头和代码拼接,32位hello world最终可以做到不足100字节大小。
内容的提问来源于stack exchange,提问作者Kolay.Ne
相关产品推荐
相关产品推荐

