Запустите двоичный файл x86 на архитектуре Power 9 - PullRequest
0 голосов
/ 14 декабря 2018

Каковы наилучшие варианты для запуска скомпилированного двоичного файла x86 на процессоре IBM "Power 9"?К сожалению, у меня нет исходного кода, и двоичный файл не был скомпилирован с отладочной информацией, поэтому я не могу перекомпилировать его.

1 Ответ

0 голосов
/ 21 декабря 2018

Как упомянуто в комментарии @Peter Cordes, первый вариант - полная эмуляция (эмуляция ядра и приложений x86_64), другой - перевод пользовательского режима QEMU (эмуляция только пользовательского режима, перевод системных вызовов в работающее ядро ​​ppc64).Здесь мы собираемся использовать перевод пользовательского режима QEMU.

У вас должна быть работающая установка Gentoo ppc64, которая может быть достигнута с помощью Catalyst на x86, следующий шаг - получить крест x86_64.Среда разработки, если у вас ее еще нет при подготовке к Catalyst.Он создаст каталог / usr / x86_64-multilib-linux-gnu / и будет создан с помощью кросс-x86_64-multilib-linux-gnu / glibc и аналогичных ebuilds.

Затем вам потребуется QEMU с правильными целями (добавьте это в make.conf и установите qemu):

QEMU_USER_TARGETS="x86_64"

Чтобы разрешить запуск приложений x86_64, как и любого другого приложения, необходимо включить binfmt_misc (CONFIG_BINFMT_MISC) в ядре и загрузить определение ELF x86_64.Либо посмотрите на /etc/init.d/qemu-binfmt (Open-RC), либо добавьте этот файл /etc/binfmt.d/qemu-x86_64.conf и включите службу systemd-binfmt (для systemd):

:x86_64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e

Это позволит автоматически запускать двоичные файлы x86_64 с использованием qemu-x86_64.

Но если вы не используете chroot, он все равно не будет работать из-за отсутствующего компоновщика ld и библиотек.Используя strace, вы можете видеть, что он пытается загружать библиотеки по разным путям.Он ищет компоновщик в /lib64/ld-linux-x86-64.so.2, поэтому мы должны создать там символическую ссылку.Для других библиотек он использует / lib64 / x86_64 и / usr / lib64 / x86_64, которые являются идеальными кандидатами для символических ссылок.Единственный оставшийся путь - это gcc libs, мы не можем добавить их в /etc/ld.so.conf.d, где находится ваш ppc64 GCC LDPATH, поэтому мы должны создать символические ссылки для отдельных файлов.Другими словами, вы хотите сделать что-то вроде этого:

sudo ln -s /usr/x86_64-multilib-linux-gnu/lib64 /lib64/x86_64
sudo ln -s /usr/x86_64-multilib-linux-gnu/usr/lib64 /usr/lib64/x86_64
sudo ln -s /lib64/x86_64/ld-linux-x86-64.so.2 /lib64/ld-linux-x86-64.so.2
sudo ln -s /usr/lib/gcc/x86_64-multilib-linux-gnu/7.3.0/libgcc_s.so.1 /lib/x86

После этого двоичные файлы x86 должны автоматически работать так же, как и любой другой двоичный файл, без использования явного chroot.

Вы можетестолкнулся с проблемой, что исполняемый файл не может загрузить библиотеки, несмотря на то, что вы видите, что библиотека x86_64 найдена.Все, что вы видите, это сбой mmap с ошибкой EFAULT и такие ошибки, как «ошибка при загрузке общих библиотек» или «не удалось сопоставить сегмент из общего объекта».Это потому, что ваше ядро ​​не скомпилировано с размером страницы 4 КБ!В файле menuconfig ядра оно находится в разделе «Конфигурация ядра» -> «Размер страницы» (CONFIG_PPC_4K_PAGES = y).Это должно быть 4 КБ, потому что это стандартный размер страницы x86_64

...