那个 6K 的尺寸是 gcc 默认配置的坑。其实可以压缩:
$ cat m.c
int main(int argc, char* argv[])
{
if (argc == 3) {
return -2;
} else if (argc == 5 ) {
return -3;
} else {
return 0;
}
}
void _start(int argc, char* argv[])
{
register long a0 asm("a0") = main(argc, argv);
register long syscall_id asm("a7") = 93;
asm volatile ("scall" : "+r"(a0) : "r"(syscall_id));
}
$ riscv64-unknown-elf-gcc -nostdlib -nostartfiles -Os m.c -o m -Wl,-static -fdata-sections -ffunction-sections -Wl,--gc-sections -Wl,-s
$ ls -l m
-rwxrwxr-x 1 ubuntu 576 Jul 9 05:46 m*
$ riscv64-unknown-elf-strip -R .comment -R .riscv.attributes -R .shstrtab m -o m_strip
$ ls -l m_strip
-rwxrwxr-x 1 ubuntu 360 Jul 9 05:46 m_strip*
360 字节里实际的代码只有 30 bytes,剩下的基本上就是 ELF 本身的开销了。