Подтвердить что ты не робот

Создание ядра Linux в Mac OS X

Я делаю проект для изменения ядра Linux. У меня есть настольная Linux-машина, и у меня нет проблем с созданием ядра.

Однако я собираюсь в путешествие, и я хочу работать на своем пути. У меня только MacBook. Когда я пытался построить ядро ​​Linux, он жаловался, что elf.h was not found.

Я загружаю elf.h из Интернета. Теперь он жалуется: NO ELF

Я попытался скопировать весь /usr/include с моего рабочего стола Linux и установить его как каталог include и по-прежнему получать странные ошибки, например "u8" not declared

Каков стандартный способ разработки ядра на Mac? У меня есть виртуальная машина под управлением Linux на том же Mac, и она будет использоваться для тестирования модифицированного ядра. Тем не менее, я действительно не хочу создавать на нем ядро, так как это немного медленнее.

4b9b3361

Ответ 1

Во-первых, я согласен с тем, что обычно проще использовать виртуальную машину Linux. Тем не менее, если вы действительно хотите это сделать, я успешно скомпилировал код ядра Linux, используя следующую процедуру.

Прежде чем вы сможете начать, вам может потребоваться установить исходное дерево Linux в файловой системе с учетом регистра на вашем Mac. (файловая система HFS по умолчанию нечувствительна к регистру.) Я не буду рассказывать об этом здесь, но многие люди делают это, чтобы скомпилировать исходное дерево Android, поэтому вы можете используйте Google, чтобы найти инструкции.

Сначала вам понадобятся следующие файлы для кросс-компиляции ядра в ящике OS X (скопируйте их из вашей известной рабочей виртуальной машины Linux на локальный /usr/include):

/usr/include/elf.h
/usr/include/features.h
/usr/include/bits/predefs.h
/usr/include/bits/wordsize.h
/usr/include/gnu/stubs.h
/usr/include/gnu/stubs-64.h

Далее вам понадобится malloc.h, чтобы быть в ожидаемом месте для системы Linux, так что:

sudo ln -s /usr/include/malloc/malloc.h /usr/include/malloc.h

Наконец, вам нужно будет беспокоиться о том, подходит ли компилятор в вашей системе для создания ядра Linux. Я использовал эту процедуру для ядер, скомпилированных для Android, используя подходящую кросс-компиляторную привязку, но я не уверен, что вы можете успешно скомпилировать ядро ​​Linux с помощью компилятора gcc по умолчанию на OS X (если у вас есть тот, который поставляется с Xcode...)


РЕДАКТИРОВАТЬ. Вы также можете выполнить шаги, указанные в ошибке, приведенной в комментарии выше, от "nmagerko", чтобы убедиться, что у вас есть правильные зависимости, и версия GNU sed. В частности:

$ sudo port install libelf
$ sudo port install gsed

Ответ 2

Это общий вопрос (ну, как правило, он работает на Windows, но ответ тот же).

Просто не делай этого. У вас будет так много проблем с получением чего-либо, чтобы строить правильно, это просто не стоит. Используйте виртуальную машину, как вы сказали сами. Это немного медленнее, но не так много, и, по крайней мере, здание будет работать правильно.

Развитие ядра достаточно сложно, не вводя дополнительных, ненужных проблем.

Ответ 3

Вот обновление для Android 6.0 Marshmallow и OSX 10.10 Yosemite. Используя этот метод, я сделал несколько успешных кросс-сборок. Единственным ограничением является то, что я только сделал это с полным исходным кодом AOSP.

Я использовал brew libelf, чтобы получить красивую библиотеку эльфов с управляемым пакетом. Это дает нам файл эльфа, который мы должны включить, usr/local/opt/libelf/include/libelf/gelf.h

brew install libelf

Но это все равно будет вызывать ошибки при сборке, если вы привязываете его к usr/local/include, поскольку, по-видимому, некоторые определения отсутствуют. Поэтому я украл отсутствующие определения из <kernel_source>/arch/arm/include/asm/elf.h и создал файл с поддержкой прокладки:

cat <<EOT >> /usr/local/include/elf.h
#include "../opt/libelf/include/libelf/gelf.h"
#define R_386_NONE 0
#define R_386_32 1
#define R_386_PC32 2
#define R_ARM_NONE 0
#define R_ARM_PC24 1
#define R_ARM_ABS32 2
#define R_MIPS_NONE 0
#define R_MIPS_16 1
#define R_MIPS_32 2
#define R_MIPS_REL32 3
#define R_MIPS_26 4
#define R_MIPS_HI16 5
#define R_MIPS_LO16 6
#define R_IA64_IMM64 0x23 /* symbol + addend, mov imm64 */
#define R_PPC_ADDR32 1 /* 32bit absolute address */
#define R_PPC64_ADDR64 38 /* doubleword64 S + A */
#define R_SH_DIR32 1
#define R_SPARC_64 32 /* Direct 64 bit */
#define R_X86_64_64 1 /* Direct 64 bit */
#define R_390_32 4 /* Direct 32 bit. */
#define R_390_64 22 /* Direct 64 bit. */
#define R_MIPS_64 18
EOT

Этого должно быть достаточно, чтобы завершить сборку. Если кому-то нужна дополнительная информация об этом, у меня есть сообщение которое охватывает полную версию ядра Android на OSX.

Ответ 4

Скомпилировать ядро ​​с использованием предварительных построек AOSP

Я сделал символические ссылки на отсутствующие заголовки OSX из хостов Linux, и, по-видимому, это сработало хорошо! В моей настройке я синхронизировал весь AOSP repo, который включает в себя все prebuilts, но те, которые я фактически использую для создания ядра, следующие:

Клонировать их так, чтобы выполнялось следующее дерево каталогов:

<SOME-PATH>/prebuilts/
<SOME-PATH>/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.8/
<SOME-PATH>/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.8/

Убедитесь, что вы проверяете соответствующий филиал/тег в соответствии с целевой версией Android.

Установите отсутствующие заголовки

Не уверен, что это правильный способ сделать это, но вставка кучи заголовков linux в /usr/local/include устраняет все проблемы. Не забудьте chmod +x script.

install_headers.sh:

#!/bin/sh

PREBUILTS_DIR="<SOME-PATH>/prebuilts" # fill in the path here!

PREBUILT_GCC=$PREBUILTS_DIR"/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.8"
KERNEL_HEADERS=$PREBUILT_GCC"/sysroot/usr/include"
HOST_HEADERS="/usr/local/include"

function install_header() {
    header=$1
    ln -s $KERNEL_HEADERS/$header $HOST_HEADERS/$header
}

# create symlinks for the missing headers
install_header elf.h
install_header features.h
# the following are folders (that contain headers)
install_header bits
install_header gnu
install_header linux
install_header asm
install_header asm-generic

Построить ядро ​​

export PATH=<SOME-PATH>/prebuilts/gcc/darwin-x86/arm/arm-eabi-4.8/bin:$PATH
export ARCH=arm
export SUBARCH=arm
export CROSS_COMPILE=arm-eabi-
# in this example it builds for N6
make shamu_defconfig
make -j8

Вуаля:

Ядро: arch/arm/boot/zImage-dtb готов

Моя конфигурация

  • macOS Sierra 10.12.3
  • XCode: с помощью MacOSX10.11.sdk, который позволяет строить AOSP на mac
  • Целевое устройство: N6/shamu
  • ветвь AOSP: Marshmallow (обновлено mac_version.mk в build, чтобы разрешить использование 10.12.3 sdk)

Ответ 5

Это работает с kitkat (не пробовал более ранние версии) - make -j8 ARCH=arm CROSS_COMPILE=arm-eabi- HOSTCFLAGS="-I ../external/elfutils/libelf"

Предполагается, что остальная часть сборки android устанавливается как обычно, а каталог ядра находится в сборке android.