В настоящее время я изучаю код запуска Linux, но небольшая проблема беспокоит меня.Почему язык сборки GAS может вызвать глобальную переменную языка C непосредственно без объявления?
setup.c:
unsigned int __atags_pointer __initdata;
голова common.S
.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
линия .long __atags_pointer @ r6
в головными common.S называет глобальную переменную в setup.c без каких-либо заявлений, , таких как .global __atags_pointer
. Почему это работает?
Поскольку сборник GNU не является C или любым другим диалектом сборки? Я не уверен, что есть большая часть ответа за пределами «потому что [это как раз так.] (Https://www.sourceware.org/binutils/docs/as/Extern.html#Extern)» – Notlikethat
Насколько я знаете, в общем, язык ассемблера GNU будет делать объявление, когда он вызывает глобальную переменную C-файла. –
А? Как говорят документы, нет даже такой вещи, как декларация. Любой ссылочный символ, который не имеет локального определения, просто _assumed_ является внешним; вот и все. – Notlikethat