在Mac OS X上构buildLinux内核

我正在做一个修改Linux内核的项目。 我有一台桌面Linux机器,我没有任何问题构build内核。

但是,我正在去旅行,我想在我的路上工作。 我只有一台MacBook。 当我尝试构buildLinux内核时,它抱怨elf.h was not found

我从网上下载一个elf.h。 现在它抱怨: NO ELF

我试图复制从我的Linux桌面的整个/usr/include ,并将其设置为包括目录,仍然得到奇怪的错误,如"u8" not declared

在Mac上进行内核开发的标准方式是什么? 我有一台在同一台Mac上运行Linux的虚拟机,它将用于testing修改后的内核。 但是,我并不是真的想在它上面创build内核,因为它有点慢。

首先,我同意使用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编译的内核,使用适当的交叉编译器工具链,但我不知道你是否能成功地编译Linux内核与OS X上的默认gcc编译器(假设你有一个自带的Xcode中…)


编辑 :你可能也想遵循上面的注释中链接到“nmagerko”的错误中指出的步骤,以确保你有正确的依赖和sed的GNU版本。 尤其是:

 $ sudo port install libelf $ sudo port install gsed 

这是一个常见的问题(好吧,通常它是建立在Windows上,但答案是一样的)。

只是不要这样做。 你将有很多麻烦得到正确的构建,这是不值得的。 使用虚拟机,就像你自己所说的那样。 这有点慢,但不是那么多,至少建设会正常工作。

内核开发很难,不会引入额外的不必要的问题。

这里是Android 6.0 Marshmallow和OSX 10.10优胜美地的更新。 我已经使用这种方法做了几次成功的跨构建。 唯一的限制是我只有在完整的AOSP源代码签出后才能完成这些工作。

我用brew的libelf来获得一个很好的包管理的精灵库。 这就得到了我们需要包含的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 

这应该足以让构建完成。 如果有人需要关于这方面的进一步的信息,我有一个职位 ,涵盖了OSX上的完整的Android内核构建。

这工程作为kitkat(没有尝试早期版本) – make -j8 ARCH=arm CROSS_COMPILE=arm-eabi- HOSTCFLAGS="-I ../external/elfutils/libelf"

这假定其余的android版本是像往常一样设置,而内核目录是在android版本。

使用AOSP预编译编译内核

我已经做了从Linux主机的失踪的OSX头的符号链接,显然它工作得很好! 在我的设置中,我已经同步了所有的AOSP repo ,其中包括所有的prebuilts ,但我实际用来构建内核的是:

  • 缺少Linux头文件: gcc / linux-x86 / host / x86_64-linux-glibc2.11-4.8
  • 交叉编译器: gcc / darwin-x86 / arm / arm-eabi-4.8 /

克隆它们,以便下面的目录树是有效的:

 <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 Sierra 10.12.3
  • XCode:使用MacOSX10.11.sdk,它允许在Mac上构建AOSP
  • 目标设备:N6 / shamu
  • AOSP分支:棉花糖(更新版mac_version.mk允许使用10.12.3 sdk)