为什么 ld 在另一个函数中找到未定义的引用而不是具有引用的函数

why does ld finds an undefined reference in another function than the one having the reference

几年前在大学里短暂地看过 ARM 汇编之后,作为一种爱好,我正在尝试学习它。

我这样修改了一个小的伪 Hello World 程序(在一本书上找到的):

 .global _start          

_start:         ldr     R1,=msgtxt      
                mov     R2,#11          
                bl      v_asc           
                mov     R0,#0           
                mov     R7,#1           
                svc     0               


                .text
v_asc:          mov    R0,#1           
                mov    R7,#4           
                svc    0               
                bx      LR              
                .end


                .data
msgtxt:         .ascii  "Yeah Baby!\n"

LD 抛出以下错误:

prog.o: In function v_asc': (.text+0x1c): undefined reference tomsgtxt'

只需将 .data 部分放在 .text 部分之上,就可以让它发挥作用。但是, _start 仍然高于 .data :

 .global _start          

_start:         ldr     R1,=msgtxt      
                mov     R2,#11          
                bl      v_asc           
                mov     R0,#0           
                mov     R7,#1           
                svc     0               

                .data
msgtxt:         .ascii  "Yeah Baby!\n"

                .text
v_asc:          mov    R0,#1           
                mov    R7,#4           
                svc    0               
                bx      LR              
                .end

但这让我很困惑:

为什么 LD 假装引用在 v_asc 而它在 _start 中?为什么行 "ldr R1,=msgtxt" 没有抛出未定义的引用?

提前致谢。

我正在回答我的问题,因为 Jester 在评论中做了它(谢谢!)。

我犯了一个新手错误,没有理解 .end 是针对整个程序的。

至于关于未定义引用的主要问题,这是由于“=”的语义,它把常量放在文字池中,在目标文件中,文字池在 v_asc 之后(我发现通过此页面了解更多信息:http://benno.id.au/blog/2009/01/02/literal-pools).