Вопрос или проблема
Цель
Я хочу запустить бинарный файл ARM64 Go на x86_64 Kali Linux, используя режим пользователя QEMU.
Проблема
Я получил aarch64-linux-musl-cross
.
~$ wget https://musl.cc/aarch64-linux-musl-cross.tgz
~$ tar -xvf aarch64-linux-musl-cross.tgz
Затем я использовал ~/aarch64-linux-musl-cross/bin/aarch64-linux-musl-gcc
для компиляции простой программы Hello World на Go. Она скомпилировалась именно так, как я хотел.
~/go_projects/bin$ file hello
hello: ELF 64-битный исполняемый файл, ARM aarch64, версия 1 (SYSV), динамически связанный, интерпретатор /lib/ld-musl-aarch64.so.1, Go BuildID=-37pQ_4dEsp4pnAgj4QV/0unDR_0nE-A-DsF1SfKd/-8CRGAArG5J0XNspP2M-/u6ChmkaiRo9qoxEE15eo, не обрезанный
Но, по какой-то причине, интерпретатор ~/aarch64-linux-musl-cross/aarch64-linux-musl/lib/ld-musl-aarch64.so.1
является сломанной ссылкой на /lib/libc.so
.
У меня есть файл /usr/aarch64-linux-gnu/lib/libc.so
, но это всего лишь текстовый файл.
~$ file /usr/aarch64-linux-gnu/lib/libc.so
/usr/aarch64-linux-gnu/lib/libc.so: ASCII текст
~$ cat /usr/aarch64-linux-gnu/lib/libc.so
/* Скрипт GNU ld
Используйте разделяемую библиотеку, но некоторые функции есть только в
статической библиотеке, так что попробуйте это вторично. */
OUTPUT_FORMAT(elf64-littleaarch64)
GROUP ( /usr/aarch64-linux-gnu/lib/libc.so.6 /usr/aarch64-linux-gnu/lib/libc_nonshared.a AS_NEEDED ( /usr/aarch64-linux-gnu/lib/ld-linux-aarch64.so.1 ) )
На что должна указывать ссылка ld-musl-aarch64.so.1
?
Ух ты, я нашёл свой ответ сразу после публикации этого…
sudo dpkg --add-architecture arm64
sudo apt update
sudo apt install -y --no-install-recommends musl:arm64
ln -f -s /lib/aarch64-linux-musl/libc.so ~/aarch64-linux-musl-cross/aarch64-linux-musl/lib/ld-musl-aarch64.so.1
Ответ или решение
Конечно! Вот полное решение вашей проблемы:
Цель
Вы хотите запустить ARM64 Go бинарный файл на x86_64 Kali Linux, используя QEMU в пользовательском режиме.
Проблема
Вы установили кросс-компилятор aarch64-linux-musl-cross
, но столкнулись с ситуацией, когда интерпретатор ld-musl-aarch64.so.1
является неработающей ссылкой на /lib/libc.so
.
Решение
Интерпретатор ld-musl-aarch64.so.1
должен указывать на правильно установленный динамический линковщик (например, musl) для архитектуры ARM64. Ваша текущая установка не содержит нужного файла.
Вот шаги для решения проблемы:
-
Добавьте поддержку архитектуры ARM64:
Откройте терминал и выполните следующие команды:
sudo dpkg --add-architecture arm64 sudo apt update
-
Установите библиотеку musl для ARM64:
Установите минимальный набор пакетов musl, необходимый для вашего проекта:
sudo apt install -y --no-install-recommends musl:arm64
-
Создайте символическую ссылку на
ld-musl-aarch64.so.1
:Вам потребуется создать символическую ссылку на динамический линковщик, который будет указывать на правильный файл. Выполните следующую команду:
ln -f -s /lib/aarch64-linux-musl/libc.so ~/aarch64-linux-musl-cross/aarch64-linux-musl/lib/ld-musl-aarch64.so.1
Убедитесь, что путь
/lib/aarch64-linux-musl/libc.so
существует в вашей системе. Если он не обнаружен, это может означать, что установка musl прошла неудачно, и необходимо проверить статус установки.
Результат
После выполнения вышеуказанных шагов, вы должны иметь возможность запускать скомпилированный ARM64 Go бинарный файл с помощью QEMU без проблем, связанных с неподходящим динамическим линковщиком.
Если возникнут дополнительные вопросы или новые проблемы, не стесняйтесь обращаться за помощью!