Компиляция ассемблерного кода для aarch64

Я создал сборочный файл try.s с набором инструкций aarch64. Я хочу скомпилировать его на ARM8 (процессор aarch64) под управлением ubuntu. мой собственный компилятор - gcc (4.8), и я использую следующую команду для компиляции

gcc -o try.o try.s

Я получаю следующие ошибки: Ошибка: ожидается регистр ARM - mov x10, x0

Похоже, что регистры aarch4 не распознаются, хотя я думал, что gcc 4.8 поддерживает aarch64. Может ли кто-нибудь сказать мне, что мне не хватает, или есть ли какая-то особая опция, которую я должен включить. Или предложить мне собственный компилятор (не кросс-компиляторы) для выполнения aarch64. Я также хотел бы использовать gdb для отладки этого изначально.


person c_mnon    schedule 27.01.2016    source источник
comment
Вы пытались сгенерировать asm из файла C (с помощью gcc -S) для сравнения с вашим синтаксисом? (и на самом деле полностью скомпилировать, чтобы проверить, что ваш компилятор работает, но если он тот, что идет с Ubuntu, он должен)   -  person Marc Glisse    schedule 28.01.2016
comment
так что ... когда я скомпилировал его в системе x-86 с g ++ - arch64-linux-gnu, он компилируется нормально, что заставляет меня думать, что синтаксис правильный. Кроме того, он выдает ошибку, сообщающую, что регистр ARM ожидается, когда я использую 64 битовый доступ (x0-x30) :(. да, компилятор поставляется с ubuntu gcc 4.8.2   -  person c_mnon    schedule 28.01.2016
comment
Что это за Ubuntu? Я пробовал на машине aarch64 на тестовой ферме gcc, которая имеет Ubuntu 14.04.3 LTS, а gcc - 4.8.4-2ubuntu1 ~ 14.04.   -  person Marc Glisse    schedule 28.01.2016
comment
ubuntu 14.04 LTS ... На Cortex A57 (aarch64)   -  person c_mnon    schedule 28.01.2016
comment
По какой-то странной причине похоже, что у вас там 32-битный binutils. Что as -v говорит?   -  person Notlikethat    schedule 28.01.2016
comment
хм ... Ассемблер GNU версии 2.24 (arm-linux-gnueabihf) с использованием версии BFD (GNU Binutils для Ubuntu) 2.24   -  person c_mnon    schedule 28.01.2016
comment
Ага, 32-битный ассемблер. Либо у вас работают несколько испорченных многоархивных пакетов, либо вы невольно запускаете все 32-битное пользовательское пространство (я бы проверил, о чем uname -a сообщает).   -  person Notlikethat    schedule 28.01.2016
comment
есть ли какой-нибудь другой родной набор инструментов, поддерживающий aarch64 ..? Я не могу понять этого :(   -  person c_mnon    schedule 28.01.2016
comment
это имеет смысл .... как мне получить 64-битный ассемблер .. uname -a возвращает Linux tegra-ubuntu 3.12.67-g3a5c467 aarch64 aarch64 GNU / Linux   -  person c_mnon    schedule 28.01.2016
comment
Привет, Марк ... Я не могу найти пакет binutils: arm64 ... !!! поэтому запуск выше (sudo apt-get install binutils: arm64) дает ошибку, так как не может найти binutils ...... я могу установить binutils, но как получить конкретный для 64 ..? и спасибо за вашу помощь.   -  person c_mnon    schedule 28.01.2016
comment
Что-то не так с вашей системой ... Случайная проверка: dpkg --print-architecture, dpkg --print-foreign-architectures.   -  person Marc Glisse    schedule 28.01.2016
comment
архитектура печати возвращает armhf, print-foreign-arch ничего не возвращает   -  person c_mnon    schedule 28.01.2016
comment
Не то, что угадали, вы установили все 32-битное пользовательское пространство ... Вам придется переустановить все это, выбрав на этот раз правильную версию Ubuntu.   -  person Marc Glisse    schedule 28.01.2016
comment
или создать кросс-компилятор / ассемблер, что в наши дни довольно просто. Если вы находитесь на самой руке, обязательно установите правильный набор инструментов.   -  person old_timer    schedule 28.01.2016
comment
Хех, я догадался, что это может быть Tegra - последнее, что я слышал, nVidia до сих пор не предоставляет 64-битное пользовательское пространство (я предполагаю, что они используют один и тот же образ для 32-битных и 64-битных плат и просто меняют ядро), хотя в этом случае мне не нравится думать, что они сделали, чтобы не uname сообщать armv7 о том, что 64-битное ядро ​​должно в режиме совместимости ... В любом случае, я полагаю, вы могли бы попробовать взломать PPA Canonical, чтобы получить доступ к AArch64 пакеты, но может быть проще просто установить правильный 64-битный дистрибутив вместо linux4tegra.   -  person Notlikethat    schedule 28.01.2016


Ответы (1)


gcc предназначен для целей 32b. Регистры Xn не определены для набора инструкций aarch32. Это то, что вам сообщает компилятор.


Правый набор инструментов - aarch64-elf-gcc.

PS: это хорошая идея сделать расширение файла asm .S (заглавные буквы)

person user3124812    schedule 07.02.2019