最小C程序(264字节), 最小ELF程序(45字节)
极小C程序
tiny.c:
void start()
{
__asm__("movl $1, %eax;\n\t"
"movl $42, %ebx;\n\t"
"int $0x80");
}
{
__asm__("movl $1, %eax;\n\t"
"movl $42, %ebx;\n\t"
"int $0x80");
}
ld链接脚本,tiny.lds:
SECTIONS
{
. = 0x08048000 + SIZEOF_HEADERS;
t : { *(.text) }
/DISCARD/ : { *(.bss) *(.data) *(.rodata) *(.note.GNU-stack) }
/DISCARD/ : { *(.comment) }
}
{
. = 0x08048000 + SIZEOF_HEADERS;
t : { *(.text) }
/DISCARD/ : { *(.bss) *(.data) *(.rodata) *(.note.GNU-stack) }
/DISCARD/ : { *(.comment) }
}
t 段名更短, /DISCARD/ 丢弃不需要的段。
Makefile:
tiny:tiny.o
ld -static -s -T tiny.lds -o tiny tiny.o
strip tiny
tiny.o:tiny.c
gcc -fomit-frame-pointer -c -o tiny.o tiny.c
clean:
rm -f tiny tiny.o
ld -static -s -T tiny.lds -o tiny tiny.o
strip tiny
tiny.o:tiny.c
gcc -fomit-frame-pointer -c -o tiny.o tiny.c
clean:
rm -f tiny tiny.o
-fomit-frame-pointer 可以省略掉 ebp 操作。
$objdump -d tiny
tiny: file format elf32-i386
Disassembly of section t:
08048074 <t>:
8048074: b8 01 00 00 00 mov $0x1,%eax
8048079: bb 2a 00 00 00 mov $0x2a,%ebx
804807e: cd 80 int $0x80
8048080: c3 ret
Disassembly of section t:
08048074 <t>:
8048074: b8 01 00 00 00 mov $0x1,%eax
8048079: bb 2a 00 00 00 mov $0x2a,%ebx
804807e: cd 80 int $0x80
8048080: c3 ret
shell执行
$make clean;make
$./tiny
$echo $?
42
$wc -c tiny
264 tiny
$./tiny
$echo $?
42
$wc -c tiny
264 tiny
极小ELF程序
来至:http://www.muppetlabs.com/~breadbox/software/tiny/teensy.html
tiny.asm
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
BITS 32
org 0x08048000
db 0x7F, "ELF" ; e_ident
dd 1 ; p_type
dd 0 ; p_offset
dd $$ ; p_vaddr
dw 2 ; e_type ; p_paddr
dw 3 ; e_machine
dd _start ; e_version ; p_filesz
dd _start ; e_entry ; p_memsz
dd 4 ; e_phoff ; p_flags
_start:
mov bl, 42 ; e_shoff ; p_align
xor eax, eax
inc eax ; e_flags
int 0x80
db 0
dw 0x34 ; e_ehsize
dw 0x20 ; e_phentsize
db 1 ; e_phnum
; e_shentsize
; e_shnum
; e_shstrndx
filesize equ $ - $$
org 0x08048000
db 0x7F, "ELF" ; e_ident
dd 1 ; p_type
dd 0 ; p_offset
dd $$ ; p_vaddr
dw 2 ; e_type ; p_paddr
dw 3 ; e_machine
dd _start ; e_version ; p_filesz
dd _start ; e_entry ; p_memsz
dd 4 ; e_phoff ; p_flags
_start:
mov bl, 42 ; e_shoff ; p_align
xor eax, eax
inc eax ; e_flags
int 0x80
db 0
dw 0x34 ; e_ehsize
dw 0x20 ; e_phentsize
db 1 ; e_phnum
; e_shentsize
; e_shnum
; e_shstrndx
filesize equ $ - $$
标准ELF头部就有52字节, 这个ELF其实是不标准的,只是可以运行(readelf, objdump, gdb都不能识别这个程序)。
shell
$ nasm -f bin -o tiny tiny.asm
$ chmod +x tiny
$ ./tiny ; echo $?
42
$ wc -c tiny
45 tiny
$ chmod +x tiny
$ ./tiny ; echo $?
42
$ wc -c tiny
45 tiny