gpt4 book ai didi

c - 如何告诉编译器在 _Noreturn 函数中内联 asm 后不生成 "retq"?

转载 作者:太空狗 更新时间:2023-10-29 16:10:07 25 4
gpt4 key购买 nike

我编写了以下代码来调用系统调用 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));
}

生成文件:

.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

我用 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

syscall 之后有一个无用的 retq。我想知道,有没有什么方法可以在不诉诸于在汇编中编写整个函数的情况下删除它?

最佳答案

在没有返回的系统调用之后添加:

    __builtin_unreachable();

关于c - 如何告诉编译器在 _Noreturn 函数中内联 asm 后不生成 "retq"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53966637/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com