C代碼中如何使用鏈接腳本.lds中定義的變量

轉自: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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章