Включить 32-битную компиляцию в Debian squeeze (6) 64 с backports (после прекращения поддержки)

Минимальная программа инициализации hello world, шаг за шагом

enter image description here

Скомпилируйте hello world без каких-либо зависимостей, завершающуюся бесконечным циклом. init.S :

.global _start
_start:
    mov $1, %rax
    mov $1, %rdi
    mov $message, %rsi
    mov $message_len, %rdx
    syscall
    jmp .
    message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
    .equ message_len, . - message

Мы не можем использовать системный вызов exit, иначе произойдет паника ядра.

Затем:

mkdir d
as --64 -o init.o init.S # assemble
ld -o d/init init.o      # link
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"

Это создает файловую систему с нашим миром приветствия по адресу / init , которая является первой программой пользовательского уровня, которую будет запускать ядро. Мы также могли бы добавить больше файлов в d / , и они будут доступны из программы / init при запуске ядра.

Затем cd в дерево ядра Linux, сборка выполняется как обычно, и запускается в QEMU:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v4.9
make mrproper
make defconfig
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd "$ROOTFS_PATH"

И вы должны увидеть строку:

FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR

на экране эмулятора! Обратите внимание, что это не последняя строка, поэтому вам нужно посмотреть немного дальше.

Вы также можете использовать программы C, если свяжете их статически:

#include 
#include 

int main() {
    printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
    sleep(0xFFFFFFFF);
    return 0;
}

с:

gcc -static init.c -o init

Для динамической компоновки потребуется установка исполняемого файла динамического компоновщика, наиболее распространенные из которых являются частью стандартных библиотек C, таких как glibc.

Вы можете работать на реальном оборудовании с USB на / dev / sdX и:

make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX

Отличный источник по этой теме: Технический совет: Как использовать initramfs | landley.net Здесь также объясняется, как использовать gen_initramfs_list.sh , который представляет собой сценарий из дерева исходных текстов ядра Linux, помогающий автоматизировать процесс.

Проверено на Ubuntu 16.10, QEMU 2.6.1.

Следующие шаги

Следующее, что вам нужно сделать, это настроить BusyBox .

BusyBox реализует базовые утилиты POSIX-y CLI, включая оболочку POSIX-y, которая позволяет вам более легко экспериментировать с системой в интерактивном режиме.

Лично я предпочитаю полагаться только на Buildroot , потрясающий набор скриптов, который автоматизирует сборку всего из исходных текстов и создание корневой файловой системы.

Я загрузил для этого очень подробный и автоматизированный помощник по адресу: https://github.com/cirosantilli/linux-kernel-module-cheat

1
01.06.2018, 10:59
1 ответ

Para una compilación de 32 -bits(i386)en una compilación de 64 -bits(amd64)en Debian 6, no debería necesitar multi -arch; si instala gcc-multilibog++-multilib(según su objetivo )y compila congcc -m32(o g++ -m32), debería obtener el resultado que busca.

2
27.01.2020, 23:32

Теги

Похожие вопросы