我编写了以下代码来调用syscall exit
,而未与glibc链接:
// a.c
#include <stdlib.h>
#include <sys/syscall.h>
#include <unistd.h>
_Noreturn void _start()
{
register int syscall_num asm ("rax") = __NR_exit;
register int exit_code asm ("rdi") = 0;
// The actual syscall to exit
asm volatile ("syscall"
: /* no output Operands */
: "r" (syscall_num), "r" (exit_code));
}
Makefile
:
.PHONY: clean
a.out: a.o
$(CC) -nostartfiles -nostdlib -Wl,--strip-all a.o
a.o: a.c
$(CC) -Oz -c a.c
clean:
rm a.o a.out
我用make
CC=clang-7
进行了调试,它运行得很好,除了检查由objdump -d a.out
生成的程序集之外:
a.out: file format elf64-x86-64
Disassembly of section .text:
0000000000201000 <.text>:
201000: 6a 3c pushq $0x3c
201002: 58 pop %rax
201003: 31 ff xor %edi,%edi
201005: 0f 05 syscall
201007: c3 retq
在retq
之后有一个无用的syscall
。我想知道,有什么方法可以在不借助汇编语言编写整个函数的情况下将其删除吗?
答案 0 :(得分:5)
在不返回的系统调用之后添加此代码:
__builtin_unreachable();