【问题标题】:Why GAS assembly language can calls a C language global variable directly without any declaration?为什么 GAS 汇编语言可以直接调用 C 语言的全局变量而不需要任何声明?
【发布时间】:2016-07-18 08:24:46
【问题描述】:

这几天我在学习linux启动代码,但是有个小问题困扰着我。

setup.c

unsigned int __atags_pointer __initdata;

head-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。为什么会起作用?

【问题讨论】:

  • 因为 GNU 程序集不是 C 或任何其他程序集方言?我不确定除了“因为that's just how it is.”之外还有很多答案
  • 据我所知,一般情况下,GNU汇编语言在调用C文件全局变量时都会进行声明。
  • 嗯?正如文档所说,甚至没有声明这样的东西。任何没有本地定义的引用符号都只是假定是外部的;仅此而已。

标签: c linux arm gnu-assembler


【解决方案1】:

我不这么认为:

.long  __atags_pointer

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

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

7.44 '.int 表达式'

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

如果你单独编译文件得到一个.o,然后在上面运行objdump -D,我相信你会看到这个空间全是0。但是,在链接之后,相同的空间中将有一个实际数字。

【讨论】:

  • 非常感谢,我想我已经找到上面回复的原因了。
【解决方案2】:

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

您所说的内容是由 C 代码声明为全局的,而程序集只是试图按名称使用该标签。

【讨论】:

  • 非常感谢,我想我已经找到上面回复的原因了。
【解决方案3】:

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

5.5.2 类型

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

7.94 .type

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

【讨论】:

  • 嗯?为什么将本地符号 __mmap_switched_data 作为数据符号导出到链接器(即更具体地等同于 .global)与使用外部符号 __atags_pointer 有任何关系? ?
猜你喜欢
  • 2015-04-26
  • 2019-02-19
  • 2014-05-30
  • 1970-01-01
  • 2017-07-23
  • 2014-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多