25

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

しかし、私は旅行に行くので、途中で働きたいです。私はMacBookしか持っていません。Linuxカーネルを構築しようとすると、それは不平を言いましたelf.h was not found

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

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

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

4

6 に答える 6

24

まず、通常は 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 用にコンパイルされたカーネルにこの手順を使用しましたが、gccOS X のデフォルト コンパイラを使用して Linux カーネルを正常にコンパイルできるかどうかはわかりません (Xcode に付属のコンパイラがあると仮定します)。 ...)


編集:「nmagerko」からの上記のコメントにリンクされているバグで指摘されている手順に従って、正しい依存関係と の GNU バージョンがあることを確認することもできますsed。特に:

$ sudo port install libelf
$ sudo port install gsed
于 2012-04-04T23:02:07.140 に答える
8

これはよくある質問です (まあ、通常は Windows 上でビルドしていますが、答えは同じです)。

やらないでください。何かを正しく構築するのに非常に苦労することになりますが、それだけの価値はありません。あなたが言ったように、仮想マシンを使用してください。少し遅くなりますが、それほどではなく、少なくともビルドは正しく機能します。

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

于 2012-04-04T21:00:21.847 に答える
4

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

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

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

それが適切な方法かどうかはわかりませんが、大量の Linux ヘッダーを配置すると/usr/local/include、すべての問題が解決します。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 OSX10.11.sdk を使用してAOSP、Macでのビルドを可能にします
  • 対象機種:N6/shamu
  • AOSP ブランチ: Marshmallow ( 10.12.3 SDK を使用できるようにmac_version.mk更新)build
于 2017-02-22T00:21:48.420 に答える