не удается открыть /lib/ld-linux-aarch64.so.1 в qemu или gem5

Я пытаюсь смоделировать простой пример ARM Hello world на своем настольном компьютере. Пробовал и qemu, и gem5. Оба дают аналогичную ошибку. Они не могут найти ld-linux-aarch64.so.1. Собственно и найти не могу. Если бы я мог его найти, я бы показал его с помощью -L (в qemu) или --redirects (в gem5).

Это файл:

armhello: ELF 64-bit LSB shared object, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=23a21b7a545ac510923b6b3713d2bbee092f820a, for GNU/Linux 3.7.0, not stripped

Он скомпилирован с помощью: aarch64-linux-gnu-gcc

Я пытаюсь запустить его в qemu с помощью:

qemu-aarch64 armhello

У меня такая ошибка:

/lib/ld-linux-aarch64.so.1: No such file or directory

Я пытаюсь запустить его в gem5 с помощью: (simpleARM.py указывает на мой исполняемый файл (названный armhello))

build/ARM/gem5.opt configs/tutorial/simpleARM.py

У меня такая ошибка:

panic: panic condition fd < 0 occurred: Failed to open file /lib/ld-linux-aarch64.so.1.

Как я могу это решить?

Примечание: я знаю, что он работает при компиляции --static. Но мне нужно запускать более сложные двоичные файлы, которые динамически связаны, и я не могу их изменить. Это всего лишь пример.


person cervX    schedule 27.10.2020    source источник
comment
ld-linux-aarch64.so.1 - это динамический компоновщик для гостевого двоичного файла. Если у вас есть динамически связанный гостевой двоичный файл, вам необходимо сообщить эмулятору не только о самом двоичном файле, но также о динамическом компоновщике и всех динамических библиотеках, на которые ссылается гостевой двоичный файл (обычно путем передачи ему опции, чтобы сообщить ему о каталоге в котором все библиотеки находятся на обычных местах в реальной файловой системе гостя).   -  person Peter Maydell    schedule 27.10.2020


Ответы (1)


Для gem5 вы можете использовать --redirects и --interp-dir: Как запустить в gem5 динамически подключаемый исполняемый файл в режиме эмуляции системных вызовов se.py?

Для qemu вам понадобится -L: Использование динамического компоновщика с qemu-arm

person Ciro Santilli    schedule 27.10.2020
comment
Спасибо за ваш ответ. Теперь я могу запустить простой пример hello world. Я не уверен, как использовать --redirect с более сложным двоичным файлом. Я так понимаю, что он перенаправляет / lib на выбранный нами путь. Работает с ld-linux-aarch64.so.1. Но, например, у меня есть общий объект, который связывается во время компиляции. Это общий объект libarmnn.so.22, он расположен по адресу /home/username/armnn/build. Как я могу показать этот путь к gem5, чтобы он мог получить к нему доступ? - person cervX; 27.10.2020
comment
@cervX --redirect преобразует <guest-path-prefix>=<actual-host-path-prefix> для всех обращений к файлам. Гость ищет lib по заданному пути. Таким образом, вы должны определить путь к общей библиотеке, которую будет пытаться использовать гость, например с _3 _ или из сообщений об ошибках, а затем используйте префикс, который выполняет правильное перенаправление. Это зависит от того, как именно вы даете ссылку. Если для .so используется полный путь, вам может не понадобиться перенаправление. - person Ciro Santilli; 28.10.2020
comment
Понятно. Я решил проблему, используя параметр --env в gem5. Я оставлю этот комментарий для использования в будущем. - person cervX; 29.10.2020