Ykon O'Clast
Ykon O'Clast

Reputation: 195

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

as a hobby I'm trying to learn ARM assembly after briefly seeing it years ago in College.

I modified a little pseudo Hello World program (found in a book) this way :

 .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 throws the following error :

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

Simply putting the .data section above the .text one makes it work like a charm. But then, _start is still above .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

But this confuses me :

Why is LD pretending the reference is in v_asc while it is in _start? How come the line "ldr R1,=msgtxt" does not throw an undefined reference?

Thanks by advance.

Upvotes: 2

Views: 421

Answers (1)

Ykon O'Clast
Ykon O'Clast

Reputation: 195

I'm answering my question since Jester did it in comment (thanks!).

I made a rookie mistake not understanding the .end was for the whole program.

As for the main question about the undefined reference, it is due to the semantics of '=' which places the constant in the literal pool which, in the object file, is after v_asc (I found out more with this page : http://benno.id.au/blog/2009/01/02/literal-pools).

Upvotes: 2

Related Questions