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.
0 votes
askubuntu.com/questions/168279/
0 votes
Je dois modifier le chargeur ELF de manière à ce qu'il soit capable de charger différentes sections .text en fonction d'un certain nombre d'octets situés dans l'en-tête ELF. Cela signifie également que la structure des fichiers ELF est modifiée.