我尝试在 macosX 下的汇编中使用动态分配,并且在从 C 库调用
_malloc
时遇到了相当奇怪的行为。
我的最终目标是在内存中分配 10 个字节之类的东西,但是当在分配的块之外写入数据时,程序不会出现段错误。
也许我不明白
_malloc
是如何工作的。
这是我写的测试代码。我首先尝试将大小推入堆栈,就像 Christopher Swenson 似乎所做的那样。然后我读到this帖子,似乎说尺寸应该在
rdi
中。由于后者是最近的,我认为它也是最正确的。
extern _malloc ;; malloc from the C library
section .text
global _start
_start:
xor rdi, rdi
mov rdi, 10 ;; I try to allocate 10 bytes
call _malloc ;; The address should be in rax
mov qword [rax], 1 ;; writing some data where it is supposed to work
add rax, 11 ;; going outside the allocated chunk
mov qword [rax], 1 ;; writing some data where it is not supposed to work
mov rax, 0x2000001
mov rdi, 0
syscall
为了简单起见,我不测试
rax
,假设它不是 NULL
。
我编译了:
$ nasm -f macho64 -o test.o test.asm
$ gcc -e _start test.o -lc -m64 -o a.out -Wl,-no_pie
有人可以解释我如何不正确使用
_malloc
或者为什么在分配的块之外写入不会 segfault ?
当您使用
malloc
分配内存并且分配成功时,保证您分配的内存可以访问。 但是,不能保证其他内存无法访问。 只是不保证可以访问。 所以不要依赖它。
在实践中,
malloc
一次向操作系统请求大块内存,然后将这些块分配给您进行的各种小分配。 因此,经常会看到可访问的内存多于分配的内存。 但是,该内存不得使用,它不属于您的分配。 相反,malloc
可能会将内存分配给未来的分配。 它还可以用于其他目的,例如簿记。 所以不要访问它。