为何ARM汇编程序需添加.global main才能编译运行?
关于ARM汇编中
.global main的疑问 对应的ARM汇编代码
.text .global main fib: push { r4} MOV r1, #1 MOV r2, #0 MOV r3, #1 loop: CMP r3, r0 BGE exit mov r4,r1 ADD r1, r1,r2 mov r2, r4 add r3, r3, #1 B loop exit: pop {r4} mov r0, r1 MOV PC, lr main: mov r0, #13 push {lr} BL fib pop {lr} mov r1, r0 ldr r0, =output_string push {lr} bl printf pop {lr} MOV PC, lr @ The 'data' section contains static data for our program .data output_string: .asciz "%d\n"
问题解答
为什么单个目标文件也需要
.global main?
汇编器默认会把你定义的符号(比如这里的main)标记为局部符号,只能在当前汇编文件内部访问。链接器不管目标文件数量多少,都需要找到一个全局可见的入口符号——哪怕只有一个目标文件,链接器也无法识别局部的main。.global main的作用就是把main从局部符号提升为全局符号,让链接器能够定位到它。.global main是否用于指定程序入口?缺失它程序为何无法运行?
是的,链接器默认会把全局符号main当作程序的入口点(你也可以通过链接器参数指定其他入口,但默认规则是找main)。如果没加.global main,main是局部符号,链接器搜遍所有全局符号都找不到入口,就会抛出“找不到入口点”的错误,导致链接失败,程序自然无法生成和运行。你所说的“编译失败”其实是链接阶段出的问题,汇编本身可以通过,但链接环节通不过。
内容的提问来源于stack exchange,提问作者user394334
相关产品推荐
相关产品推荐

