gpt4 book ai didi

linux - malloc 和免费的 x86 NASM + 编译

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:52 25 4
gpt4 key购买 nike

我一直在自学 x86 汇编,并一直在寻找基本的 malloc() 和 free() 调用。我花了很多时间搜索,但大多数示例都是针对 64 位的,或者只显示没有免费的 malloc 调用等。我什至用 c 写了这个,然后编译和反汇编它,这有帮助,但 gcc 增加了很多其他说明。

这是我根据自己的想法制作的一个基本示例,请告诉我这是否正确,或者是否还有其他我应该做的事情:

global _start
; glibc stuff
extern _malloc, _free

section .data
err: db "malloc failed!", 10, 0
.len: equ $ - err

section .bss
mptr resd 1 ;pointer to begining of malloc'd memory

section .text
_start:

push 20 ;allocate 20 bytes
call _malloc ;call malloc
add esp, 4 ;clean pushed imm

test eax, eax ;check for malloc error
jz merror

mov [mptr], eax ;store address

mov byte [eax], 0
mov byte [eax + 1], 1

push mptr ;push address
call _free ;call free
add esp, 4 ;clean push

exit:
mov eax, 0x1
int 80h

merror:
mov eax, 0x4
mov ebx, 0x1
mov ecx, err
mov edx, err.len
int 80h
jmp exit

我的问题的第二部分是编译它。根据我能够找到的内容,我需要链接 /lib/ld-linux.so.2。所以在我的 makefile 中有以下内容,但它出错了:

mem: mem.asm
nasm -f elf mem.asm
ld -melf_i386 -lc -I /lib/ld-linux.so.2 mem.o -o mem

这是我在尝试编译时遇到的错误:

enter image description here

正如我所说的,我是 x86 的菜鸟,所以如果您对更好的做事方式有任何意见,我也将不胜感激! :)

更新:

所以我继续使用 gcc 并让它工作(至少没有错误):

mem: mem.asm
nasm -f elf mem.asm
gcc -m32 mem.o -o mem

然而,当我去运行它时,它崩溃了很长时间: enter image description here

我显然在 free 上做错了,但正如我提到的,我对 mallocfree 的使用并不乐观,因为我找不到任何可靠的例子。有什么线索吗?

最佳答案

感谢大家的帮助!所以首先我能够通过使用 gcc 链接而不是 ld 来修复链接错误:

mem: mem.asm
nasm -f elf mem.asm
gcc -m32 mem.o -o mem

为了让它工作,我需要将函数的名称从 _malloc_free 更改为 malloc免费。我还必须将标准 global _start 更改为 global main 以使 gcc 满意。这让它可以无误地编译和链接,但是正如您在更新中看到的那样,当需要释放内存时,程序会严重崩溃。

这是因为我将错误的地址压入堆栈。我最初有指令 push mptr 但那是将 mptr 的地址推送到堆栈而不是它指向的地址,因此出现错误。为了将正确的地址推送到堆栈,对指令进行了简单的更新,使我的简单程序可以无错误地运行:

push dword [mptr]

最终结果:

global main
; glibc stuff
extern malloc, free

section .data
err: db "malloc failed!", 10, 0
.len: equ $ - err

section .bss
mptr resd 1 ;pointer to begining of malloc'd memory

section .text
main:

push 20 ;allocate 20 bytes
call malloc ;call malloc
add esp, 4 ;clean pushed imm

test eax, eax ;check for malloc error
jz merror

mov [mptr], eax ;store address

mov byte [eax], 0 ;store 0 at index 0
mov byte [eax + 1], 1 ;store 1 at index 1

push dword [mptr] ;push address
call free ;call free
add esp, 4 ;clean push

exit:
mov eax, 0x1
int 80h

merror:
mov eax, 0x4
mov ebx, 0x1
mov ecx, err
mov edx, err.len
int 80h
jmp exit

再次感谢大家的帮助和感谢Peter Cordes给了我一个提供正确答案的机会! :)

我相信随着我的旅程继续,我会带着更多新手 x86 问题回来!

关于linux - malloc 和免费的 x86 NASM + 编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45899289/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com