Eu preciso modificar a implementação do kernel do carregador ELF de uma distribuição Ubuntu 14.04. Tendo baixado as fontes usando:
sudo apt-get source linux-image-$(uname -r)
Eu executei o script de configuração:
make config
na árvore de origem raiz. Após uma sequência aparentemente interminável de solicitações de entrada, o script criou o arquivo .config necessário para construir o kernel (ou um conjunto de módulos). A versão do kernel que estou usando é linux-3.13.0 e tem o seguinte layout de árvore de fontes:
$ 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
O carregador ELF está localizado em /path/to/source/fs/binfmt_elf.c . Seguindo esta pergunta, a fim de compilar um módulo individual é suficiente para executar
make /path/to/module/directory
Nesse caso, seria:
make ./path/to/source/fs
A compilação é bastante longa; leva cerca de vinte minutos (em uma máquina virtual) e a saída é gravada (por padrão) no mesmo diretório em que o módulo está localizado. Eu encontrei os arquivos objeto executando:
find . -name "*.o"
em / path / to / source / fs. Filtrando pelo nome, o carregador ELF pode ser localizado executando:
find . -name "*elf*.o"
Nas fontes atuais, ele é escrito (por padrão) em:
/path/to/source/fs/binfmt_elf.o
Tendo passado pelo tutorial , notei que os módulos do kernel têm a convenção de nomenclatura [module_name] .ko para distingui-los dos arquivos de objeto do espaço do usuário.
A minha pergunta é como posso inserir o novo carregador ELF (modificado) no kernel, dado que o carregador ELF atual está presente (como descarregar, pode impedir a execução de binários)?
Editar # 1:
A execução de lsmod fornece:
$ 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
Qual módulo precisa ser compilado como um LKM para incluir o carregador ELF. Por padrão, o carregador é construído no kernel base.