0

我试图通过更改 brk 将堆大小增加 100,但我不知道为什么我的代码不起作用。
这是尝试执行此操作的代码部分:

movq $0, %rdi
movq $12, %rax
syscall
movq %rax, InicialHeap

movq InicialHeap, %rsi
mov $str, %rdi
call printf

movq $100, %rdi
movq $12, %rax
syscall

movq %rax, %rsi
mov $str, %rdi
call printf

movq InicialHeap, %rdi
movq $12, %rax
syscall

movq InicialHeap, %rsi
mov $str, %rdi
call printf

movq $60, %rax
syscall

程序应该打印类似:
x (print InicialHeap)
x + 100 (print InicialHeap + 100)
x (print InicialHeap)
但它只打印 3 次相同的结果“x”。
我必须做些什么来增加我的堆大小?

4

1 回答 1

0

正如手册页int brk(void *addr);的 NOTES 部分所描述的那样,系统调用 ( __NR_brk= 12) 实际上实现了brk(),而不是sbrk返回当前中断而不是整数。

正如@osgx 评论的那样,尝试在 strace 下运行你的程序,看看你得到了什么返回值。例如从,您可以看到动态链接器通过使用找出当前中断strace /bin/true来启动是正常的:brk(0)

brk(0)                                  = 0x24c6000

从那里,您应该保存返回值,并在下次调用时brk()使用一个偏移量。


您当前的代码显然无法正常工作:

movq $100, %rdi
movq $12, %rax
syscall             ;;  brk((void*)100)
于 2016-06-19T09:34:09.737 回答