为什么GAS汇编语言可以直接调用C语言全局变量而不进行任何声明?

时间:2016-07-18 08:24:46

标签: c linux arm gas

我现在正在学习Linux启动代码,但是一个小问题困扰着我。

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

head-common.S 中的行.long __atags_pointer @ r6在没有任何声明的情况下调用 setup.c 中的全局变量, 例如.global __atags_pointer。它为什么有效?

3 个答案:

答案 0 :(得分:0)

我不这么认为:

.long  __atags_pointer

是一个电话。这是一个伪表达。在这种情况下,我认为它创建了一个4字节的空间,并为链接器留下了一个标记,用链接时的值填充空格。从气体手册:

  

'。long'与'.int'相同。 *注意'.int':Int。

     

7.44'.int EXPRESSIONS'

     

期望任何部分的零或多个EXPRESSIONS,以逗号分隔。   对于每个表达式,发出一个在运行时为值的数字   那个表达。数字的字节顺序和位大小取决于   该集会的目标是什么。

如果您单独编译文件以获取.o,则在其上运行objdump -D,我相信您会看到该空间全部为0。但是,链接后,相同的空格中将包含实际数字。

答案 1 :(得分:0)

.globl是你如何声明全局的东西,以便ELSE可以找到它。在C中,缺少静态意味着标签是全局的,所以其他人可以找到它。当您使用标签时,汇编器和/或链接器只需将其放入要查找的事物表中。就像在C中一样,你理想地将某些内容声明为extern,但是你没有必要声明两个具有相同名称的全局内容,并且工具应该对其进行排序以共享该资源。

你所谈论的事情是由C代码宣布为全局的,汇编只是试图按名称使用该标签。

答案 2 :(得分:0)

谢谢大家!我发现它是如何申报的! the head-common.S 中的行.type __mmap_switched_data, %object 已作出声明。从气体手册:

5.5.2输入

符号的type属性包含重定位(节)信息,指示符号是外部的任何标志设置,以及(可选)链接器和调试器的其他信息。确切的格式取决于使用的对象代码输出格式。

7.94 .type

该指令用于设置符号的类型。