我正在尝试分配两个内存块并写入其中一个(NASM,我今天更新的 Arch 上的 Linux 86_64,glibc):
global main
extern malloc
section .text
main:
mov rdi, 5
call malloc
mov qword [array], rax
mov qword [rax+24], 5 ; mov qword [rax+8], 5 or mov qword [rax+10000] doesn't die on me
mov rdi, 5
call malloc
section .bss
array resq 1
当我这样做时:
nasm -felf64 test.s; gcc test.o; ./a.out
我得到:
test.out: malloc.c:2395: sysmalloc: Assertion `(old_top == initial_top (av) && old_size == 0) || ((unsigned long) (old_size) >= MINSIZE && prev_inuse (old_top) && ((unsigned long) old_end & (pagesize - 1)) == 0)' failed.
Keskeytetty (luotiin core-tiedosto)
(最后一行大致翻译成英语为中断(创建了一个核心文件),即核心转储)
谷歌搜索和搜索SO告诉我,我可能正在写入malloc为自己的内部使用而设置的东西。实际测试似乎证实了这一点(只有当我确实尝试编写时才会发生错误。
但是我找不到我应该做些什么来防止这种情况。有更深见的人可以告诉我应该怎么做吗?
提前谢谢你。
好的,正如Michael Petch所说,malloc似乎将其大小视为字节。所以这将起作用:
global main
extern malloc
section .text
main:
mov rdi, 40 ; 5*8
call malloc
mov qword [array], rax
mov qword [rax+24], 5 ; mov qword [rax+8], 5 or mov qword [rax+10000] doesn't die on me
mov rdi, 5
call malloc
section .bss
array resq 1