Проблема компиляции Aarch64 u-boot

В настоящее время я испытываю действительно странную ошибку при компиляции для u-boot:

Вектор

init_fnc_t *init_sequence[] ={...}

заполняется 0/NULL вместо указателей на функции. Я думал, что перехитрил компилятор, вызвав все эти функции «вручную». Однако эта ошибка имеет еще больше последствий, поскольку структура драйвера также получает указатели 0 / NULL:

static struct serial_device my_serial_drv = {
    .name = "my_serial",
    .start = my_serial_init,
    .stop = NULL,
    .setbrg = my_serial_setbrg,
    .putc = my_serial_putc,
    .puts = my_serial_puts,
    .getc = my_serial_getc,
    .tstc = my_serial_tstc,
};

что, конечно, когда я звоню

 'my_serial_drv'->start(); 

устанавливает компьютер в 0 и впоследствии все вылетает.

Забавный факт: .name попадает в двоичный файл, поэтому с разделами .data, вероятно, все в порядке, как только они будут установлены.

Я тестировал это с помощью двоичных файлов aarch64-linux-gnu-*-4.7 и aarch64-linux-gnu-*-4.9. Вы можете найти 4.9 по адресу: http://releases.linaro.org/latest/components/toolchain/binaries.

Любая помощь будет принята с благодарностью :)


person Adrian Nițu    schedule 02.10.2014    source источник
comment
Какой выпуск u-boot? А вы пробовали использовать компилятор ELDK от denx? denx.de/wiki/view/DULG/ELDKAvailability, если есть проблема с компиляцией с другими компиляторами я всегда возвращаюсь к ELDK.   -  person sessyargc.jp    schedule 03.10.2014
comment
ELDK не поддерживает arm64 (или aarch64). Я начал работать с клона u-boot git, последняя публичная фиксация: c9aab0f9dd23fddcebf5984dc19e62b514e759a7 в понедельник, 21 апреля, 21:01:35 2014 +0200   -  person Adrian Nițu    schedule 03.10.2014
comment
c9aab0f9dd23fddcebf5984dc19e62b514e759a7 было много лет назад! Хотя ваша проблема, похоже, связана с набором инструментов, а не с u-boot. Если вы просматриваете список рассылки u-boot, никто не сообщает о той же проблеме, что и вы. news.gmane.org/gmane.comp.boot-loaders.u- загрузка   -  person sessyargc.jp    schedule 06.10.2014


Ответы (1)


С файлом u-boot.bin все в порядке. Выяснив, почему это работает, я увидел, что make u-boot запускает отдельную команду для исправления корзины:

start=$(aarch64-linux-gnu-nm u-boot | grep __rel_dyn_start | cut -f 1 -d ' ');
end=$(aarch64-linux-gnu-nm u-boot | grep __rel_dyn_end | cut -f 1 -d ' '); 
tools/relocate-rela u-boot.bin 0x3e900000 $start $end

(это была одна строка, но я разделил ее для удобства чтения)

person Adrian Nițu    schedule 10.10.2014