首页 > 解决方案 > 如何更改 asm x64 中的 errno 值

问题描述

我为一个学校项目编写程序集,但我卡在一个点上,我需要在 asm 中重写读取,所以我明白了,但我需要设置 errno 变量,然后我的读取可以返回 -1 以防出错例如,将 errno 的值设置为 9。而且我没有找到如何更改这个著名的 errno :( 这是我的实际代码:

global my_write

section .text
my_write:
    mov rax, 1  ; sys_write
    syscall     ; call write
    cmp rax, 0
    jl error
    ret
error:
    mov rax, -1
    ret

ps:我找到了需要使用 __error 的地方,但我没有找到任何关于此的文档 :(

非常感谢 :D

编辑 :

谢谢你们的帮助!__errno_location 工作我做这个:

extern __ernno_location
global my_write

section .text
my_write:
    mov rax, 1  ; sys_write
    syscall     ; call write
    cmp rax, 0
    jl error
    ret
error:
    neg rax    ; get absolute value of syscall return
    mov rdi, rax
    call __ernno_location
    mov [rax], rdi  ; set the value of errno
    mov rax, -1
    ret

标签: linuxassemblyx86-64system-callserrno

解决方案


这是一件棘手的事情。您需要在系统中查找 的定义errno。它可能正在通过一个辅助函数,如

/* Function to get address of global `errno' variable.  */
extern int *__errno_location (void) __THROW __attribute__ ((__const__));
/* When using threads, errno is a per-thread value.  */
#   define errno (*__errno_location ())

因此,您可以从程序集中调用该函数,然后通过返回的指针设置值。更便携的方法是在 C 中编写一个辅助函数,比如:

#include <errno.h>
void set_errno(int value)
{
    errno = value;
}

这将照顾平台相关的东西。


推荐阅读