本文共 1098 字,大约阅读时间需要 3 分钟。
在链接脚本中,经常有这样的代码:
SECTIONS{ ..... . = ALIGN(4); .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .got : { *(.got) } . = ALIGN(4); __bss_start = .; .bss : { *(.bss) } _end = .;}
其中__bss_start, _end 表示BSS段的起始、终止地址。
我们想对这段空间清零时,
1.在汇编代码中,可以直接引用__bss_start, _end,比如:
ldr r0, =__bss_startldr r1, =_end
2. 在C代码中,我们不能直接引用它们,要这样做:
void clean_bss(void){ extern int __bss_start, _end; int *p = &__bss_start; for (; p < &_end; p++) *p = 0;}__bss_start, _end不是表示某个值吗?在C代码中为什么要使用取址符号 & ?
int foo = 1000;会导致2件事情发生:
在链接脚本中,假设
__bss_start = 1000__bss_start并不是一个变量,它只是一个值,并不需要在内存中留出一段空间来保存它;
extern int __bss_start;int val = &__bss_start;使用取址符号&去得到它在符号表中的值。
注意,这个值只是链接脚本中定义的值,并不表示某个变量的地址。
转载于: