前言:
当前兄弟们对“c语言脚本”大约比较注意,我们都需要剖析一些“c语言脚本”的相关资讯。那么小编在网摘上收集了一些有关“c语言脚本””的相关资讯,希望你们能喜欢,朋友们快快来了解一下吧!在链接脚本中,经常有这样的代码:
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, =_end2.在C代码中,我们不能直接引用它们,要这样做:
void clean_bss(void){extern int __bss_start, _end;int *p = &__bss_start; for (; p < &_end; p++) *p = 0;}
你可能会疑惑:__bss_start, _end不是表示某个值吗?在C代码中为什么要使用取址符号 & ?
原因:一,在C代码中,这样的语句:
int foo = 1000;
会导致2件事情发生:
在代码中,留出4字节的空间,保存数值1000
在C语言的symbole talbe,即符号表中,有一个名为foo的项,它里面存有那4字节空间的地址。
我们执行 foo = 1时,会先去符号表中找到foo对应的地址,然后把数值1填到那个地址对应的内存;
我们执行 int *a = &foo时,会直接把符号表中foo的地址,写给a。
二,在链接脚本中,假设
__bss_start = 1000
__bss_start并不是一个变量,它只是一个值,并不需要在内存中留出一段空间来保存它;
在C语言中,符号表中会有一个名为__bss_start的项,这个项目中的值(地址值)是1000;
注意,这个1000并没有实际存在的内存。
三.所以:在C语言中,要去使用链接脚本中定义的值时,应该这样做:
extern int __bss_start;int val = &__bss_start;
使用取址符号&去得到它在符号表中的值。
注意,这个值只是链接脚本中定义的值,并不表示某个变量的地址。
————————————————
版权声明:本文为CSDN博主「韦东山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:
标签: #c语言脚本