Мне нужно изменить реализацию ядра загрузчика ELF дистрибутива Ubuntu 14.04. Скачав исходники, используя:
sudo apt-get source linux-image-$(uname -r)
Я запустил сценарий конфигурации:
make config
в корневом исходном дереве. После, казалось бы, бесконечной последовательности входных запросов сценарий создал файл .config, необходимый для сборки ядра (или набора модулей). Я использую версию ядра linux-3.13.0 и имеет следующую структуру дерева исходного кода:
$ 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
Загрузчик ELF находится в /path/to/source/fs/binfmt_elf.c. Следующий этот вопрос, чтобы скомпилировать отдельный модуль, достаточно запустить
make /path/to/module/directory
В этом случае это будет:
make ./path/to/source/fs
Сборник довольно длинный; это занимает около двадцати минут (на виртуальной машине), и вывод записывается (по умолчанию) в том же каталоге, в котором расположен модуль. Я нашел объектные файлы, выполнив:
find . -name "*.o"
в / путь / к / источнику / fs. Фильтруя по имени, можно найти загрузчик ELF, запустив:
find . -name "*elf*.o"
В текущих источниках это записано (по умолчанию) на:
/path/to/source/fs/binfmt_elf.o
Пройдя через этот Я заметил, что модули ядра имеют соглашение об именах [имя_модуля] .ko чтобы отличить их от объектных файлов пользовательского пространства.
У меня вопрос: как я могу вставить новый (модифицированный) загрузчик ELF в ядро, учитывая, что текущий загрузчик ELF присутствует (поскольку его выгрузка может помешать выполнению двоичных файлов)?
Редактировать # 1:
Бег lsmod дает:
$ 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
Какой модуль нужно скомпилировать как LKM, чтобы включить загрузчик ELF. По умолчанию загрузчик встроен в базовое ядро.
Попробуй это:
Как создать единый модуль ядра в виде дерева?
В качестве альтернативы я обычно делаю это примерно так. Это по памяти и может сработать, а может и не сработать. Он также строит все модули.
Установите текущий исходный код ядра:
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
Некоторым устройствам необходимо добавить имя модуля в / etc / modules, если оно не загружается автоматически.