Как я могу вызвать sprintf из сборки x86_64? - PullRequest
0 голосов
/ 20 августа 2010

Я пытаюсь преобразовать double в строку в стеке из кода сборки x86_64:

        bs.code += isa.movsd(registers.xmm0, MemRef(registers.rsp))
        bs.code += isa.pop(registers.rax)

        bs.code += isa.push(registers.rbp)
        bs.code += isa.mov(registers.rbp, registers.rsp)

        bs.code += isa.sub(registers.rsp, 100)
        bs.code += isa.and_(registers.rsp, -16)

        bs.code += isa.mov(registers.rdi, registers.rsp)
        bs.code += isa.mov(registers.rsi, <address of "%i\0">)
        bs.code += isa.mov(registers.rax, <address of sprintf in libc>)
        bs.code += isa.call(registers.rax)

Программа segfaults на call(rax) с

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff6a2919b in *__GI___overflow (f=0x7fffffffb5d0, ch=9698128) at genops.c:248
warning: Source file is more recent than executable.
248   return _IO_OVERFLOW (f, ch);

Я думаю sprintf должен вызываться специально, потому что он использует переменные аргументы, поэтому кто-нибудь может посоветовать правильный способ сделать это из сборки?

1 Ответ

1 голос
/ 20 августа 2010

Поможет ли вам написать простой вызов sprintf в C и использовать gcc -s foo.c?

...