我试图通过更改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“。
我必须做什么来增加我的堆大小?
发布于 2016-06-19 17:34:10
正如the man page for int brk(void *addr); describes的注释部分所示,系统调用(__NR_brk = 12)实际上实现了brk(),而不是sbrk,但返回的是当前的break而不是整数。
作为@osgx的注释,试着在strace下运行你的程序,看看你得到了什么返回值。例如,在strace /bin/true中,你可以看到动态链接器通过使用brk(0)找出当前的中断来启动是正常的:
brk(0) = 0x24c6000在那里,您应该保存返回值,并使用该返回值的偏移量下一次调用brk()。
你当前的代码显然不能工作:
movq $100, %rdi
movq $12, %rax
syscall ;; brk((void*)100)https://stackoverflow.com/questions/37904260
复制相似问题