轉自:https://blog.csdn.net/xiaodingqq/article/details/79290320
在鏈接腳本中,經常有這樣的代碼:
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_start
ldr 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代碼中爲什麼要使用取址符號 & ?
原因:
一.
在C代碼中,這樣的語句:
int foo = 1000;
會導致2件事情發生:
1. 在代碼中,留出4字節的空間,保存數值1000
2.在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;
使用取址符號&去得到它在符號表中的值。
注意,這個值只是鏈接腳本中定義的值,並不表示某個變量的地址。
轉載於:http://www.100ask.org/bbs/forum.php?mod=viewthread&tid=16231&highlight=%C1%B4%BD%D3%BD%C5%B1%BE
————————————————
版權聲明:本文爲CSDN博主「mainn」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xiaodingqq/article/details/79290320