web-dev-qa-db-fra.com

construction du noyau Linux sur Mac OS X

Je fais un projet pour modifier le noyau Linux. J'ai une machine Linux de bureau et je n'ai aucun problème à construire un noyau dessus.

Cependant, je pars en voyage et je veux continuer mon chemin. Je n'ai qu'un MacBook. Quand j'ai essayé de construire le noyau Linux, il s'est plaint que elf.h was not found.

Je télécharge un elf.h sur Internet. Maintenant, il se plaint: NO ELF

J'ai essayé de copier l'intégralité de /usr/include à partir de mon bureau Linux et définissez-le comme répertoire d'inclusion, et obtenez toujours des erreurs étranges comme "u8" not declared

Quelle est la méthode standard de développement du noyau sur Mac? J'ai une machine virtuelle exécutant Linux sur le même Mac et elle sera utilisée pour tester le noyau modifié. Cependant, je ne veux pas vraiment construire de noyau dessus, car c'est un peu lent.

23
Alfred Zhong

Tout d'abord, je conviens qu'il est généralement plus simple d'utiliser simplement une machine virtuelle Linux. Cela dit, si vous voulez vraiment faire cela, j'ai réussi à compiler le code du noyau Linux en utilisant la procédure ci-dessous.

Avant de commencer, vous devrez peut-être installer l'arborescence des sources Linux sur un système de fichiers sensible à la casse sur votre Mac. (le système de fichiers HFS par défaut ne respecte pas la casse.) Je ne couvrirai pas cela ici, mais beaucoup de gens le font pour compiler l'arborescence source Android Android, donc vous pouvez utiliser Google pour trouver des instructions .

Vous aurez d'abord besoin des fichiers suivants pour compiler de manière croisée un noyau sur une boîte OS X (copiez-les depuis votre Linux connu VM vers votre _ /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

Ensuite, vous aurez besoin de malloc.h pour être à l'emplacement prévu pour un système Linux, faites ainsi:

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

Enfin, vous devrez vous demander si le compilateur installé sur votre système convient ou non à la construction du noyau Linux. J'ai utilisé cette procédure pour les noyaux compilés pour Android, en utilisant une chaîne d'outils de compilateur croisé appropriée, mais je ne sais pas si vous pouvez compiler avec succès un noyau Linux avec le compilateur par défaut gcc sur OS X (en supposant que vous avez celui qui vient avec Xcode ...)


[~ # ~] modifier [~ # ~] : vous pouvez également suivre les étapes indiquées dans le bogue lié dans le commentaire ci-dessus à partir de " nmagerko ", pour vous assurer d'avoir les bonnes dépendances et la version GNU de sed. En particulier:

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

Il s'agit d'une question courante (enfin, elle s'appuie généralement sur Windows, mais la réponse est la même).

Ne le fais pas. Vous allez avoir tellement de mal à faire construire quoi que ce soit correctement, ça n'en vaut pas la peine. Utilisez une machine virtuelle, comme vous l'avez dit vous-même. C'est un peu plus lent, mais pas tant que ça, et au moins la construction fonctionnera correctement.

Le développement du noyau est assez difficile sans introduire de problèmes supplémentaires inutiles.

6
Kristof Provost

Voici une mise à jour pour Android 6.0 Marshmallow et OSX 10.10 Yosemite. J'ai effectué plusieurs builds croisés avec succès en utilisant cette méthode. La seule limitation est que je ne les ai fait qu'avec la source AOSP complète extraite .

J'ai utilisé libelf de brew pour obtenir une bibliothèque elf gérée par un package Nice. Cela nous donne le fichier elf que nous devons inclure, usr/local/opt/libelf/include/libelf/gelf.h

brew install libelf

Mais cela générera toujours des erreurs lors de la construction si vous le liez symboliquement à usr/local/include car apparemment certaines définitions manquent. J'ai donc volé les définitions manquantes dans <kernel_source>/Arch/arm/include/asm/elf.h et a créé un fichier d'inclusion de cale:

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

Cela devrait être suffisant pour terminer la construction. Si quelqu'un a besoin d'informations supplémentaires à ce sujet, j'ai un post qui couvre un noyau complet Android build sur OSX.

3
3martini

Compiler le noyau à l'aide des préconfigurations d'AOSP

J'ai créé des liens symboliques vers les en-têtes OSX manquants à partir des hôtes Linux et apparemment, cela a bien fonctionné! Dans ma configuration, j'ai synchronisé l'ensemble AOSP repo , qui comprend tous pré-constructions , mais ceux que j'utilise actuellement pour construire le noyau sont:

Clonez-les pour que l'arborescence de répertoires suivante soit valide:

<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/

Assurez-vous de cocher la branche/balise appropriée, en fonction de votre Android cible.

Installer les en-têtes manquants

Je ne sais pas si c'est la bonne façon de le faire, mais en mettant un tas d'en-têtes Linux dans /usr/local/include résout tous les problèmes. N'oubliez pas de chmod +x le scénario.

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

Construire le noyau

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

Voila:

Noyau: Arch/arm/boot/zImage-dtb est prêt

Ma configuration

  • macOS Sierra 10.12.3
  • XCode: en utilisant MacOSX10.11.sdk, qui permet de construire AOSP sur mac
  • Appareil cible: N6/shamu
  • Branche AOSP: Marshmallow (mise à jour mac_version.mk in build pour autoriser l'utilisation du sdk 10.12.3)
3
Paschalis

Cela fonctionne à partir de KitKat (n'a pas essayé les versions antérieures) - make -j8 Arch=arm CROSS_COMPILE=arm-eabi- HOSTCFLAGS="-I ../external/elfutils/libelf"

Cela suppose que le reste de la version Android est configuré comme d'habitude et que le répertoire du noyau est dans la version Android.

2
Naseer