簡體   English   中英

為什么GAS匯編語言無需任何聲明即可直接調用C語言全局變量?

[英]Why GAS assembly language can calls a C language global variable directly without any declaration?

這些天,我正在學習linux啟動代碼,但是一個小問題困擾着我。

setup.c

unsigned int __atags_pointer __initdata;

普通頭

    .align  2
    .type   __mmap_switched_data, %object
__mmap_switched_data:
    .long   __data_loc                      @ r4
    .long   _sdata                          @ r5
    .long   __bss_start                     @ r6
    .long   _end                            @ r7
    .long   processor_id                    @ r4
    .long   __machine_arch_type             @ r5
    .long   __atags_pointer                 @ r6
    .long   cr_alignment                    @ r7
    .long   init_thread_union + THREAD_START_SP @ sp
    .size   __mmap_switched_data, . - __mmap_switched_data

head-common.S中的.long __atags_pointer @ r6 行在沒有任何聲明的情況下調用setup.c中的全局變量,例如.global __atags_pointer 為什么行得通?

我不認為:

.long  __atags_pointer

是一個電話。 它是一個偽表達式。 在這種情況下,我認為它會創建一個4字節的空間,並為鏈接器留下一個標記,以便在鏈接時用該值填充該空間。 從加油手冊:

“ .long”與“ .int”相同。 *注意'.int':整數。

7.44'.int表達式'

期望任何部分的零個或多個EXPRESSIONS,以逗號分隔。 對於每個表達式,在運行時發出一個數字,該數字就是該表達式的值。 數字的字節順序和位大小取決於程序集用於哪種目標。

如果您單獨編譯文件以獲取.o,然后在其上運行objdump -D,我相信您會看到該空間全為0。 但是,鏈接之后,相同的空間中將有實際的數字。

.globl是您聲明全局內容的方式,以便其他人可以找到它。 在C語言中,缺少靜態表示標簽是全局的,因此其他人可以找到它。 使用標簽時,匯編器和/或鏈接器只是將其放在要查找的表中。 就像在C中一樣,理想情況下,您將某些東西聲明為extern,但是您不必聲明兩個具有相同名稱的全局事物,並且工具應對其進行整理以共享該資源。

您所談論的事情是由C代碼聲明為全局的,而匯編只是在嘗試按名稱使用該標簽。

謝謝大家! 我發現它是怎么聲明的! .type __mmap_switched_data, %object頭common.S作出的聲明。 從加油手冊:

5.5.2類型

符號的type屬性包含重定位(節)信息,指示符號在外部的任何標志設置以及(可選)鏈接程序和調試程序的其他信息。 確切的格式取決於所使用的目標代碼輸出格式。

7.94。類型

此偽指令用於設置符號的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM