Сборка x64 getcwd () не выводится - PullRequest
4 голосов
/ 12 февраля 2020

Я только начал изучать / использовать сборку x64 на Linux и пытаюсь вызвать getcwd() с call. После попытки вызова функции getcwd() я также пытаюсь вывести результат, который не работает, и я не понимаю, почему. Любые указатели / помощь будут очень признательны. Извините, если это глупый вопрос. Я искал в Интернете примеры, но не нашел ни одного, который бы помог мне конкретно. Большое спасибо. Вот код:

section .text
        global _start

extern getcwd

_start:
        mov     rdi,rbx
        mov     rsi,128

        call getcwd wrt ..plt

        mov     rax,1
        mov     rdi,1
        mov     rsi,rbx
        mov     rdx,128

        syscall

        mov     rax,60
        mov     rdi,0

        syscall

Я компилирую с:

nasm -f elf64 -o file.o file.asm
gcc -nostdlib -v -o file file.o -lc
./file

И ничего не отображается

Ответы [ 2 ]

2 голосов
/ 12 февраля 2020

Этот код

        mov     rdi,rbx
        mov     rsi,128

        call getcwd wrt ..plt

эквивалентен C коду getcwd(__undefined__, 128);, где __undefined__ - это некоторое значение, которое находится в ebx при входе в _start. В моей системе это было NULL, что на getcwd сигнализирует, что буфер не передается (независимо от его размера, равного 128).

Функция getcwd затем возвращает указатель на недавно выделенный буфер (как расширение для POSIX, см. man 3 getcwd). Ваш последующий mov rax,1 перезаписывает этот адрес системным вызовом, а последующие инструкции передают значение в ebx в качестве буфера для системного вызова write. Так как это было NULL ранее, согласно соглашению о вызовах оно остается таким, и вы вызываете write(1,NULL,128);, который возвращает EFAULT и ничего не пишет.

2 голосов
/ 12 февраля 2020

Вот возможная реализация, которая выделяет место в стеке. Я также переключился на main и puts:

global main
extern getcwd
extern puts

main:
        sub rsp, 128+8  ; buffer + alignment
        mov rdi, rsp
        mov rsi, 128

        call getcwd wrt ..plt
        call puts wrt ..plt

        add rsp, 128+8
        ret
...