errno
並不總是全局變量。它只是一個左值,可能是一個隱藏函數調用的宏。 the specification:
errno是宏還是標識爲外部鏈接的標識符,但未指定。
事實上,它通常不是一個全局變量,因爲它通常被實現爲線程本地(因此需要一個函數調用來檢索指向TLS塊)。
你最好有一個調用匯編函數並設置errno
的C封裝器。
編輯:既然你不能使用C函數(其中,國際海事組織,是毫無意義的,因爲errno
是牢固地固定在C/POSIX的概念),你將不得不實行errno
收集自己。在errno.h
中查找errno
的定義,並執行裝配中的任何內容。例如,我的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
。
謝謝你的回答,我更瞭解errno現在如何工作。但是我不能在C中使用包裝器,因爲它是一個學校主題,我只能使用匯編代碼。我必須在彙編中做一個小庫(〜10個函數),並且我需要errno作爲最後一個函數。 – Fateske 2013-03-08 23:20:08
埃克,真的嗎?你應該更新你的問題來反映這一點。我會更新答案。 – nneonneo 2013-03-08 23:23:30
我已更新我的問題。我嘗試將你在上次編輯的日記中解釋的內容應用。謝謝你:) – Fateske 2013-03-08 23:36:31