如何告诉编译器在 _Noreturn 函数中的内联 asm 之后不生成 "retq"?
How to tell compiler to not generate "retq" after inline asm in a _Noreturn function?
我写了下面的代码来调用系统调用 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 [=13=]x3c
201002: 58 pop %rax
201003: 31 ff xor %edi,%edi
201005: 0f 05 syscall
201007: c3 retq
syscall
后面有一个没用的retq
。我想知道,有没有什么办法可以在不诉诸于在汇编中编写整个函数的情况下删除它?
在不存在的系统调用之后添加这个 return:
__builtin_unreachable();
我写了下面的代码来调用系统调用 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 [=13=]x3c
201002: 58 pop %rax
201003: 31 ff xor %edi,%edi
201005: 0f 05 syscall
201007: c3 retq
syscall
后面有一个没用的retq
。我想知道,有没有什么办法可以在不诉诸于在汇编中编写整个函数的情况下删除它?
在不存在的系统调用之后添加这个 return:
__builtin_unreachable();