为什么 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 to
msgtxt'
只需将 .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).
几年前在大学里短暂地看过 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 to
msgtxt'
只需将 .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).