未调用 NASM 呼叫标签

Jer*_*yes 1 linux assembly x86-64 nasm ld

我正在 Linux 上使用 NASM 进行一些汇编编码,但遇到了问题。

global _start

section .text

testFunctionName:
    mov rdi, 12
    ret

_start:

    call testFunctionName

    mov rax, 1
    mov rbx, 0
    int 0x80
Run Code Online (Sandbox Code Playgroud)

然后组装和链接:

nasm -felf64 -F dwarf -g program.asm -o program.o
ld program.o -o program
Run Code Online (Sandbox Code Playgroud)

testFunctionName 永远不会跳转到。我使用 GDB 验证了这一点。我还没有在其他地方找到相关的解释。如果有人能解释发生了什么以及如何解决这个问题,我将不胜感激。

Pet*_*des 5

你可能使用nextinext哪个步骤电话,没入其中。

坐落在一个断点mov rdi, 12自己的函数中,或单步进入呼叫使用stepi(或si简称)。

或者,如果您不信任 GDB,请编写一个程序,其退出状态取决于该函数是否运行。

testFunctionName:
    mov  ebx, 12
    ret

_start:
    xor   ebx, ebx   ; ebx=0

    call testFunctionName

    mov   eax, 1
    int   0x80       ; sys_exit(ebx), 32-bit ABI
Run Code Online (Sandbox Code Playgroud)

运行它并echo $?查看退出状态是 12,而不是 0,因为除非您的 CPU 损坏,或者 NASM 或链接器损坏,否则该函数确实会运行。


您还可以在测试函数中放入非法指令,例如ud2. 或软件断点:int3. 或者除以零。会引发异常而不是让您的进程进行退出系统调用的东西。然后你肯定会注意到它是否被调用。


另请参阅如果在 64 位代码中使用 32 位 int 0x80 Linux ABI,会发生什么? 要以与 glibc 的_exit()函数相同的方式进行本机 64 位 exit(0) 系统调用,请执行

    xor   edi, edi     ; rdi=0
    mov   eax, 231     ; __NR_exit_group   from <asm/unistd_64.h>
    syscall            ; sys_exit_group(edi)
Run Code Online (Sandbox Code Playgroud)