我现在正在学习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
。它为什么有效?
答案 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
该指令用于设置符号的类型。