Я пишу игрушку ОС для моей малины 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?
Код, который вы компилируете, использует '% 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 и т. Д. –
Вы, должно быть, ищете не то место;) Мой код ранее, «_start.S». – jsz
Извините, я не понял, что вы переносите это в ARM, а не компилируете как есть. Это верно? Тогда, я думаю, [auselen] (http://stackoverflow.com/users/1163019/auselen) верен. См. Также [перемещение в руке] (http://stackoverflow.com/questions/15671717/relocation-in-assembly). –