web-dev-qa-db-ja.com

Mac OS XでのLinuxカーネルの構築

Linuxカーネルを変更するプロジェクトを行っています。私はデスクトップLinuxマシンを持っていて、その上でカーネルを構築する問題はありません。

しかし、私は旅行に行っており、途中で働きたいと思っています。 MacBookしか持っていません。 Linuxカーネルをビルドしようとすると、elf.h was not foundと文句を言われました。

私はインターネットからelf.hをダウンロードします。今それは不平を言います:NO ELF

Linuxデスクトップから/usr/include全体をコピーしてインクルードディレクトリとして設定しようとしたところ、"u8" not declaredのような奇妙なエラーが発生しました

Macでカーネル開発を行う標準的な方法は何ですか?同じMacでLinuxを実行している仮想マシンがあり、それを使用して、変更されたカーネルをテストします。ただし、カーネルが少し遅いため、カーネルを構築したくありません。

23
Alfred Zhong

まず、Linux VMを使用する方が通常は簡単であることに同意します。とはいえ、もしあなたが本当にこれをしたいのであれば、以下の手順を使用してLinuxカーネルコードを正常にコンパイルしました。

開始する前に、Macの大文字と小文字を区別するファイルシステムにLinuxソースツリーをインストールする必要がある場合があります。 (デフォルトのHFSファイルシステムでは大文字と小文字が区別されません。)ここでは説明しませんが、多くの人がAndroidソースツリーをコンパイルするためにこれを行うので、 Googleを使用して指示を見つけることができます

まず、OS Xボックスでカーネルをクロスコンパイルするには、次のファイルが必要です(既知の動作するLinuxからそれらをコピーしますVMローカル/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用にコンパイルされたカーネルにこの手順を使用しましたが、OS Xのデフォルトのgccコンパイラを使用してLinuxカーネルを正常にコンパイルできるかどうかはわかりません( Xcodeに付属するもの...)


[〜#〜] edit [〜#〜]:上記のコメントにリンクされているバグで指摘されている手順を実行することもできます。 nmagerko "、正しい依存関係、およびGNU sedのバージョンがあることを確認します。特に:

$ Sudo port install libelf
$ Sudo port install gsed
20
mpontillo

これは一般的な質問です(まあ、通常はWindowsで構築されていますが、答えは同じです)。

しないでください。正しくビルドするために何かを取得するのは非常に困難になります。それだけの価値はありません。自分が言ったように、仮想マシンを使用します。少し遅いですが、それほど多くはありません。少なくともビルドは正しく動作します。

カーネルの開発は、追加の不必要な問題を引き起こすことなく十分に困難です。

6
Kristof Provost

Android 6.0 MarshmallowおよびOSX 10.10 Yosemiteのアップデートです。この方法を使用していくつかのクロスビルドを成功させました。唯一の制限は、完全なAOSPソースをチェックアウトしてこれらを実行したことだけです。 。

私はbrewのlibelfを使用して、Niceパッケージで管理されたelfライブラリを取得しました。これにより、含める必要があるelfファイルusr/local/opt/libelf/include/libelf/gelf.hが取得されます

brew install libelf

ただし、usr/local/includeにシンボリックリンクすると、一部の定義が欠落しているように見えるため、ビルド時にエラーがスローされます。そこで、<kernel_source>/Arch/arm/include/asm/elf.hから不足している定義を盗み、shimインクルードファイルを作成しました。

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

ビルドを完了するにはそれで十分です。誰かがこれについてさらに情報を必要とする場合、私は post で完全なAndroidカーネルビルドをOSX上でカバーします)をカバーします。

3
3martini

AOSPのプリビルドを使用してカーネルをコンパイルする

LinuxホストのOSXヘッダーから欠落しているOSXヘッダーへのシンボリックリンクを作成しましたが、どうやらうまくいきました!私の設定では、すべての prebuilts を含む AOSP repo 全体を同期しましたが、実際にカーネルの構築に使用しているものは次のとおりです。

次のディレクトリツリーが有効になるように、それらのクローンを作成します。

<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ターゲットバージョンに応じて、適切なブランチ/タグをチェックアウトしてください。

不足しているヘッダーをインストールする

それが適切な方法かどうかはわかりませんが、/usr/local/includeに多数のLinuxヘッダーを配置すると、すべての問題が解決します。スクリプトをchmod +xすることを忘れないでください。

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シエラ10.12.3
  • XCode:MacでAOSPをビルドできるMacOSX10.11.sdkを使用
  • 対象デバイス:N6/shamu
  • AOSPブランチ:マシュマロ(buildmac_version.mkを10.12.3 SDKを使用できるように更新)
3
Paschalis

これはKitKatの時点で機能します(以前のバージョンは試していません)-make -j8 Arch=arm CROSS_COMPILE=arm-eabi- HOSTCFLAGS="-I ../external/elfutils/libelf"

これは、残りのAndroidビルドが通常どおりにセットアップされ、カーネルディレクトリがAndroidビルドにあることを前提としています。

2
Naseer