我试图通过更改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(打印InicialHeap)
x + 100(打印InicialHeap + 100)
x(打印InicialHeap)
但它只打印3次相同的结果“x”。
如何增加堆大小?
答案 0 :(得分:0)
作为the man page for int brk(void *addr);
describes的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)