errno
并不总是全局变量。它只需要是一个左值,并且可能是一个隐藏函数调用的宏。从规范:
未指定 errno 是宏还是使用外部链接声明的标识符。
事实上,它通常不是全局变量,因为它通常被实现为线程局部的(因此需要函数调用来检索指向 TLS 块的指针)。
你最好有一个调用汇编函数和集合的 C 包装器errno
。
编辑:由于您不能使用 C 函数(IMO 是没有意义的,因为errno
它确实是 C/POSIX 概念),因此您必须自己实现errno
收集。找到errno
in的定义errno.h
,并实现汇编中的任何内容。例如,我的errno.h
定义errno
为
extern int * __error(void);
#define errno (*__error())
因此,我会调用__error
函数(返回一个int *
),然后存储到返回的地址。例如,这是我的系统为设置生成的程序集errno
:
$ gcc -xc - -o- -S <<EOF
#include <errno.h>
main() { errno = 3; return 0; }
EOF
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main:
Leh_func_begin1:
pushq %rbp
Ltmp0:
movq %rsp, %rbp
Ltmp1:
subq $16, %rsp
Ltmp2:
callq ___error
movl $3, (%rax)
...
您的系统可能会有不同的errno
.