.globl(或更常见的形式 .global)是 GNU 汇编器中的一个伪指令,用于声明全局符号

1. 基本语法格式

.globl symbol_name

.globl symbol1, symbol2, symbol3

注意.globl.global 的历史别名,两者功能完全相同。现代 GNU 汇编器通常使用 .global,但两者都支持。

2. 功能说明

  • 声明一个或多个符号为全局可见(global visibility)
  • 使符号能够被其他模块(其他汇编文件、C文件等)引用
  • 链接器会将全局符号包含在符号表中,供链接时使用

3. 使用示例

3.1 声明函数为全局

# 声明函数为全局
.globl _start
.globl main
.globl my_function

_start:
    # 启动代码
    bx lr

my_function:
    # 函数实现
    bx lr

3.2 声明数据为全局

# 声明全局变量
.globl global_variable
.globl buffer

.section .data
global_variable:
    .word 0x12345678

buffer:
    .space 256

3.3 多个符号一起声明

# 一次声明多个全局符号
.globl func1, func2, var1, var2

4. 典型应用

4.1 启动代码示例

# ARM Cortex-M 启动代码
.section .text
.globl Reset_Handler
.globl Default_Handler

Reset_Handler:
    # 复位处理程序
    ldr sp, =_estack
    bl main
    b .

Default_Handler:
    # 默认中断处理程序
    b .

4.2 与 .type 配合使用

# 指定符号类型
.globl my_func
.type my_func, %function
my_func:
    bx lr

.globl my_data
.type my_data, %object
my_data:
    .word 0
    .size my_data, 4

6. 链接时的作用

6.1 符号可见性层次

  1. 局部符号(默认):只在当前文件内可见
  2. 全局符号.globl):在所有链接文件中可见
  3. 外部符号.extern):在其他文件中定义,在当前文件中使用

6.2 链接器处理

  • 全局符号会在最终的可执行文件中保留
  • 链接器会解析所有对全局符号的引用
  • 如果多个模块定义了同名的全局符号,链接器会报”multiple definition”错误

7. 实际应用场景

7.1 C 和汇编混合编程

// C 代码 (main.c)
extern void asm_function(void);
extern int asm_variable;

int main() {
    asm_function();
    return asm_variable;
}
# 汇编代码 (asm.s)
.globl asm_function
.globl asm_variable

.section .text
asm_function:
    # 函数实现
    bx lr

.section .data
asm_variable:
    .word 42

7.2 库函数导出

# 数学库函数
.globl sin, cos, tan, sqrt

sin:
    # 正弦函数实现
    bx lr

cos:
    # 余弦函数实现
    bx lr

8. 注意事项

  1. 大小写敏感性.globl.global 是等价的,但符号名称通常是大小写敏感的
  2. 重复声明:可以多次使用 .globl 声明同一个符号
  3. 与链接脚本配合:全局符号通常需要在链接脚本中定义,以确定其在内存中的位置
  4. 调试信息:使用 .type 指定符号类型(函数、对象等)有助于调试器识别