.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 符号可见性层次
- 局部符号(默认):只在当前文件内可见
- 全局符号(
.globl):在所有链接文件中可见 - 外部符号(
.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. 注意事项
- 大小写敏感性:
.globl和.global是等价的,但符号名称通常是大小写敏感的 - 重复声明:可以多次使用
.globl声明同一个符号 - 与链接脚本配合:全局符号通常需要在链接脚本中定义,以确定其在内存中的位置
- 调试信息:使用
.type指定符号类型(函数、对象等)有助于调试器识别
