4 votes

Compilation d'un module individuel du noyau (Debian/Ubuntu)

Je dois modifier l'implémentation du noyau du chargeur ELF d'une distribution Ubuntu 14.04. J'ai téléchargé les sources en utilisant :

sudo apt-get source linux-image-$(uname -r)

J'ai exécuté la configuration script :

make config

dans l'arbre source racine. Après une séquence apparemment sans fin de demandes d'entrée, le script a créé le fichier .config nécessaire pour construire le noyau (ou un ensemble de modules). La version du noyau que j'utilise est linux-3.13.0 et a la disposition suivante de l'arbre des sources :

$ ls 
arch   COPYING  crypto         Documentation  dropped.txt  FileSystemMakefile  fs       init  Kbuild   kernel  MAINTAINERS  mm   README          samples  security   sound  ubuntu  virt
block  CREDITS  debian.master  drivers        elf.dat      firmware            include  ipc   Kconfig  lib     Makefile     net  REPORTING-BUGS  scripts  shortcuts  tools  usr

Le chargeur ELF est situé dans /path/to/source/fs/binfmt_elf.c . Suivant este question, pour compiler un module individuel il suffit d'exécuter

make /path/to/module/directory 

Dans ce cas, ce serait :

make ./path/to/source/fs

La compilation est assez longue ; elle prend environ vingt minutes (sur une machine virtuelle) et la sortie est écrite (par défaut) dans le même répertoire dans lequel le module est situé. J'ai trouvé les fichiers objets en exécutant :

find . -name "*.o"

dans /path/to/source/fs. En filtrant par nom, le chargeur ELF peut être localisé en exécutant :

find . -name "*elf*.o"

Dans les sources actuelles, il est écrit (par défaut) dans :

/path/to/source/fs/binfmt_elf.o

Après être passé par este j'ai remarqué que les modules du noyau ont la convention de dénomination suivante [nom_du_module].ko afin de les distinguer des fichiers objets de l'espace utilisateur.

Ma question est la suivante : comment puis-je insérer le nouveau chargeur ELF (modifié) dans le noyau si le chargeur ELF actuel est présent (car le décharger peut empêcher l'exécution des binaires) ?

Edit #1 :

Running lsmod donne :

$ lsmod
Module                  Size  Used by
nls_utf8               12557  1 
isofs                  39835  1 
vboxsf                 39690  0 
snd_intel8x0           38153  2 
snd_ac97_codec        130285  1 snd_intel8x0
ac97_bus               12730  1 snd_ac97_codec
snd_pcm               102099  2 snd_ac97_codec,snd_intel8x0
snd_page_alloc         18710  2 snd_intel8x0,snd_pcm
snd_seq_midi           13324  0 
snd_seq_midi_event     14899  1 snd_seq_midi
rfcomm                 69160  0 
snd_rawmidi            30144  1 snd_seq_midi
bnep                   19624  2 
bluetooth             391196  10 bnep,rfcomm
snd_seq                61560  2 snd_seq_midi_event,snd_seq_midi
snd_seq_device         14497  3 snd_seq,snd_rawmidi,snd_seq_midi
snd_timer              29482  2 snd_pcm,snd_seq
joydev                 17381  0 
snd                    69238  12 snd_ac97_codec,snd_intel8x0,snd_timer,snd_pcm,snd_seq,snd_rawmidi,snd_seq_device,snd_seq_midi
serio_raw              13462  0 
vboxguest             248441  7 vboxsf
i2c_piix4              22155  0 
soundcore              12680  1 snd
mac_hid                13205  0 
parport_pc             32701  0 
ppdev                  17671  0 
vboxvideo              12658  0 
drm                   303102  1 vboxvideo
lp                     17759  0 
parport                42348  3 lp,ppdev,parport_pc
hid_generic            12548  0 
usbhid                 52570  0 
hid                   106148  2 hid_generic,usbhid
psmouse               106678  0 
ahci                   25819  2 
libahci                32560  1 ahci
e1000                 145174  0 

Quel module doit être compilé comme un LKM afin d'inclure le chargeur ELF. Par défaut, le chargeur est intégré au noyau de base.

0 votes

Si vous avez fait un make modules_install ou similaire, vous devriez être en mesure d'utiliser modprobe. Pour insérer simplement le fichier du module en cours d'exécution, essayez insmod filename.

0 votes

A ce stade, je ne sais pas où le module se trouve réellement dans /fs. J'ai un ensemble de fichiers objets qui ne ressemblent pas à un point d'entrée de module (chaque fichier objet a le même nom que le fichier source à partir duquel il a été généré). Je n'irais pas jusqu'à insmod()-er chaque fichier individuellement.

0 votes

Est-ce que vous SURE votre problème nécessite de bricoler avec le chargeur elf ? Vous devriez essayer de poster le problème original ici également.

3voto

hookenz Points 13952

Essayez ça :

Comment construire un module de noyau unique dans l'arbre ?

Alternativement, la façon dont je procède normalement est quelque chose comme ce qui suit. Ceci est de mémoire et peut ou non fonctionner pour vous. Elle construit également tous les modules.

Installer les sources du noyau actuel :

apt-get source linux-image-$(uname -r)
cd /usr/src/linux-$(uname -r)
cp /boot/config-$(uname -r) .
make menuconfig
... enable the device

then...
make modules
make modules_install
reboot

Certains périphériques doivent être ajoutés au nom du module dans /etc/modules s'il n'est pas chargé automatiquement.

0 votes

Où sont écrits les modules par défaut ? Avec la commande de construction ci-dessus, tout était stocké dans le même répertoire (/fs). Je ne veux construire qu'un seul module fs (qui inclut le chargeur ELF). La construction d'un noyau entier prend une demi-journée.

0 votes

Oups ! une demi-journée ??? sur mon pc cela prend environ 5 minutes. Si vous avez fait une installation de modules, le résultat de la construction sera placé quelque part sous /lib/modules/$(uname -r)/kernel. Sinon, c'est dans l'arbre des sources. De mémoire, il y a un répertoire dot build ou quelque chose comme ça.

0 votes

Essayez le lien ci-dessus qui renvoie à askubuntu

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X