Создание моей программы сборки на родном RISC-V

Я некоторое время работал над проектом в сборке RISC-V в ожидании скорого появления одноплатных устройств RISC-V (https://github.com/mcmenaminadrian/riscyforth).

Я использую Spike с прокси-ядром pk (т.е. у меня есть системные вызовы, подобные Linux). Используя кросс-компилятор, я могу собрать его очень просто:

riscv64-unknown-elf-gcc riscyforth.S -o riscyforth

Затем это будет работать через Spike и pk:

spike ./path-to-pk/pk riscyforth

Но теперь у меня есть SBC, который работает на RISC-V и загружается в Linux.

Я могу получить то, что выглядит как исполняемый файл:

as riscyforth.S -o something

ld something -lc -o riscyforth

Но хотя это создает что-то с таблицей символов, которая выглядит как реальная вещь, она не запускается (сообщая, что riscyforth не может быть найден).

Я предполагаю, что мне нужно также связать crt0 или что-то подобное? Это правильно? В моем коде есть точка входа main, но при компиляции отчетов компилятора он не может найти _start (что также происходит, если я делаю main и _start указывающими на одно и то же) и вместо этого использует значение по умолчанию.

Если мне нужен элт, есть ли стандартный формат или готовый, который я могу конвертировать?

Хорошо то, что мой код не сообщает о других ошибках при компиляции (но зачем это, если он кросс-компилируется?), поэтому я надеюсь, что смогу заставить это работать.


person adrianmcmenamin    schedule 13.06.2021    source источник
comment
Когда ./foo завершается ошибкой с файлом, который не найден, это может быть связано с тем, что интерпретатор ELF (динамический компоновщик) является недопустимым путем, даже если исполняемый файл существует. (readelf -a foo и найдите путь интерпретатора или используйте file foo) Попробуйте использовать gcc -nostartfiles riscyforth.S, чтобы по-прежнему связать libc, и укажите правильный путь по умолчанию к динамическому компоновщику.   -  person Peter Cordes    schedule 13.06.2021
comment
Это сработало. Если вы хотите написать это как ответ, я приму это. Спасибо   -  person adrianmcmenamin    schedule 21.06.2021
comment
Я обновил свой существующий ответ (`bash: ./a.out: нет такого файла или каталога` при запуске исполняемого файла, созданного `ld`) с лучшим рецептом TL:DR вверху, чтобы он работал как дубликат для этого, содержащий объяснение того, что происходит, а также исправление.   -  person Peter Cordes    schedule 21.06.2021