NASM:_malloc 分配过多内存

问题描述 投票:0回答:1

我尝试在 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

macos assembly malloc nasm
1个回答
0
投票

当您使用

malloc
分配内存并且分配成功时,保证您分配的内存可以访问。 但是,不能保证其他内存无法访问。 只是不保证可以访问。 所以不要依赖它。

在实践中,

malloc
一次向操作系统请求大块内存,然后将这些块分配给您进行的各种小分配。 因此,经常会看到可访问的内存多于分配的内存。 但是,该内存不得使用,它不属于您的分配。 相反,
malloc
可能会将内存分配给未来的分配。 它还可以用于其他目的,例如簿记。 所以不要访问它。

© www.soinside.com 2019 - 2024. All rights reserved.