(N)ASM,ELF64 - .data和.bss命令在内存中

时间:2018-01-24 15:26:58

标签: assembly nasm elf memory-layout

我在内存中有关于.data和.bss部分顺序的问题, 我不会为了我的生命而谷歌。

我试图了解是否可以保证.bss部分始终来自.data部分,就内存地址而言。

我的具体需求是:

section .data
malloc_pointer:
    dq start_of_my_malloc

start_of_data:
; more stuff...

section .bss
; more stuff
start_of_my_malloc:
    resb 1 << 30 ; pre-allocate 1gig

我需要有时使用偏移[malloc_pointer] - start_of_data,所以我需要它是正面的,因此关于.bss和.data顺序的问题。

作为一方 - 我很高兴知道我是否可以引用标签start_of_data来帮助我选择要在start_of_my_malloc中保留的尺寸。 我真正想做的是:

start_of_my_malloc:
    resb (1 << 30) - start_of_data ; this won't compile though

谢谢!

2 个答案:

答案 0 :(得分:1)

关于节定位的决定由链接器完成,可以通过linker scripts(默认或自定义)进行控制。我试着不要依赖它们,因为它们会使你的代码不那么独立。

关于你的第二个问题 - 你可以汇编一次文件,从目标文件中提取.data的大小,然后用适当的-DSTART_OF_DATA=...重新组装。

答案 1 :(得分:1)

传统上,内存布局是首先是文本,然后是数据,最后是bss。这种设计非常方便,因为您可以简单地将整个二进制文件复制到内存中,然后将一大块内存清零,然后(可选)设置内存保护。要扩展bss细分,您可以使用brksbrk系统调用。

三个标签etextedataend由链接器定义,指向文本段的末尾,初始化数据的结尾和数据段的结尾。由于程序传统上映射到地址0,因此不存在标签start,从而无需标签。

不能保证布局是这样的,但由于很多程序都依赖于这种设计,因此不太可能在不久的将来改变。

如果要编写内存分配例程,建议您使用sbrk系统调用。这消除了对布局假设的全部需求,因为sbrk始终做正确的事。

请注意sbrk今天有点过时了,所以如果您想使用现代的东西,我建议您在mmap之上实施内存管理。