почему ld находит неопределенную ссылку в другой функции, отличной от той, которая имеет ссылку - PullRequest
2 голосов
/ 11 марта 2019

как хобби. Я пытаюсь научиться 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 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" не выбрасывает неопределенную ссылку?

Заранее спасибо.

1 Ответ

2 голосов
/ 11 марта 2019

Я отвечаю на мой вопрос, так как Шут сделал это в комментарии (спасибо!).

Я сделал ошибку новичка, не понимая, что .end был для всей программы.

Что касается основного вопроса о неопределенной ссылке, то это связано с семантикой '=', которая помещает константу в пул литералов, который в объектном файле находится после v_asc (я узнал больше на этой странице: http://benno.id.au/blog/2009/01/02/literal-pools).

...