[英]Why doesn't (can't) the OS translate C code directly into machine language instead first translating it into assembly language?
[英]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.