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

问题描述 投票:2回答:1

作为一个爱好,我几年前在大学里简单地看到它后,我正在努力学习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:在函数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在_start中假装引用是在v_asc中?为什么行“ldr R1,= msgtxt”不会抛出未定义的引用?

谢谢你提前。

assembly linker arm ld
1个回答
2
投票

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

我犯了一个菜鸟错误,不理解.end是整个节目。

至于关于未定义引用的主要问题,它是由于'='的语义将常量放在文本池中,在文件池中,在目标文件中,在v_asc之后(我在这个页面中发现了更多:http://benno.id.au/blog/2009/01/02/literal-pools)。

© www.soinside.com 2019 - 2024. All rights reserved.