
示例1C语言 libc 包装最常用本质还是系统调用write系统调用往标准输出打印字符串#include unistd.h int main(void) { const char msg[] hello syscall\n; // write(int fd, const void *buf, size_t count) // fd1stdout底层对应 sys_write write(1, msg, sizeof(msg)-1); return 0; }编译运行gcc write.c -o write ./write用strace看系统调用strace ./write # 会看到 write(1, hello syscall\n, 14) 14示例2直接裸系统调用不使用libc包装函数Linux x86_64syscall指令寄存器约定rax系统调用号write1exit60rdi,rsi,rdx第1、2、3参数#include sys/syscall.h int main(void) { const char msg[] raw syscall\n; // SYS_write 1 syscall(SYS_write, 1, msg, sizeof(msg)-1); // SYS_exit 60 syscall(SYS_exit, 0); }syscall()是glibc提供的通用函数直接传入syscall编号不依赖write库函数。示例3纯汇编x86_64 Linux完全不依赖libcsys.asmsection .data msg db asm syscall hello,0xa len equ $ - msg section .text global _start _start: ; write(1, msg, len) mov rax, 1 ; sys_write mov rdi, 1 ; fd stdout mov rsi, msg mov rdx, len syscall ; exit(0) mov rax, 60 ; sys_exit mov rdi, 0 syscall编译运行nasm -f elf64 sys.asm -o sys.o ld sys.o -o sys ./sys strace ./sys常见系统调用清单x86_64 Linuxsyscallrax编号作用SYS_read0读文件SYS_write1写文件SYS_open2打开文件SYS_close3关闭文件SYS_fork57创建子进程SYS_exit60退出进程参考链接 0voice · GitHub