2013-03-28 3 views
1

Я пишу игрушку ОС для моей малины pi, и я использую xv6 в качестве ссылки.сборка - используйте символы в других объектных файлах как немедленные значения

В моем коде есть ошибка компиляции, когда я попытался загрузить символ «entrypgdir», который определен в другом файле (который находится на C).

_start.S:

#include "mem.h" 

.globl entry 
entry: 
    mov r0, #(V2P_NOCAST(entrypgdir)) 

V2P_NOCAST представляет собой простой макрос, определенный в файле .h, как

mem.h:

#define V2P_NOCAST(va) ((va) - KERNBASE) 

И ошибка:

$ arm-none-eabi-gcc -c -o build/_start.o source/_start.S 
source/_start.S: Assembler messages: 
source/_start.S:17: Error: undefined symbol entrypgdir used as an immediate value 

Мне любопытно, так как это h вл xv6 это делает,

movl $(V2P_WO(entrypgdir)), %eax 

И это нормально компилируется,

$ gcc -m32 -c -o entry.o entry.S 

Является ли это что-то с моим набором инструментами? Или это невозможно в ARM?

+0

Код, который вы компилируете, использует '% eax'? Это ** x86 ** ассемблер? Вы уверены, что * source/_start.S * - это код ARM? Часто «газ» идет и пытается скомпилировать ** x86 ** ассемблер, поскольку он является кодом ARM и не дает диагностики ошибок, которые указывают на проблему. Регистры ARM являются * r0-r15 * и имеют некоторые специальные имена, такие как * lr, sp, ip, fp, pc *. Регистры типа 'eax ebx esi, edx al ah' являются хорошим ключом к тому, что код' x86'. Я получил последнее * git repo *, и этот код ** x86 **. У вас будет много проблем с этим. Я бы предложил eCos, uCos, rtems и т. Д. –

+0

Вы, должно быть, ищете не то место;) Мой код ранее, «_start.S». – jsz

+0

Извините, я не понял, что вы переносите это в ARM, а не компилируете как есть. Это верно? Тогда, я думаю, [auselen] (http://stackoverflow.com/users/1163019/auselen) верен. См. Также [перемещение в руке] (http://stackoverflow.com/questions/15671717/relocation-in-assembly). –

ответ

2

Попробуйте вместо

entry: 
    ldr r0, =(V2P_NOCAST(entrypgdir)) 

Промежуточное значение в mov инструкция должна быть встроена в инструкции, так что должно быть известно во время компиляции, а также для адреса использует, вы не можете загрузить любой 32-битовое значение с помощью mov, который заставляет вас вернуться к ldr.

+0

Спасибо! Теперь он компилируется. Дайте мне несколько дней, чтобы заставить его работать :) – jsz

+0

@jsz старайтесь использовать objdump как можно больше. это, как правило, лучший инструмент. – auselen

 Смежные вопросы

  • Нет связанных вопросов^_^