Я некоторое время работал над проектом в сборке 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
указывающими на одно и то же) и вместо этого использует значение по умолчанию.
Если мне нужен элт, есть ли стандартный формат или готовый, который я могу конвертировать?
Хорошо то, что мой код не сообщает о других ошибках при компиляции (но зачем это, если он кросс-компилируется?), поэтому я надеюсь, что смогу заставить это работать.
./foo
завершается ошибкой с файлом, который не найден, это может быть связано с тем, что интерпретатор ELF (динамический компоновщик) является недопустимым путем, даже если исполняемый файл существует. (readelf -a foo
и найдите путь интерпретатора или используйтеfile foo
) Попробуйте использоватьgcc -nostartfiles riscyforth.S
, чтобы по-прежнему связать libc, и укажите правильный путь по умолчанию к динамическому компоновщику. - person Peter Cordes   schedule 13.06.2021