【首杀达成】Nervos Script 初体验

那个 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 本身的开销了。

9 Likes