我需要修改 Ubuntu 14.04 发行版的 ELF 加载程序的内核实现。使用以下命令下载源代码:
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 加载器位于/路径/到/源/fs/binfmt_elf.c。 下列的这问题,为了编译单个模块,只需运行
make /path/to/module/directory
在这种情况下,这将是:
make ./path/to/source/fs
编译过程相当冗长;大约需要 20 分钟(在虚拟机上),输出(默认)写入模块所在的同一目录中。我通过运行以下命令找到了目标文件:
find . -name "*.o"
在 /path/to/source/fs 中。通过运行以下命令可以按名称过滤 ELF 加载程序:
find . -name "*elf*.o"
在当前来源中它被写入(默认):
/path/to/source/fs/binfmt_elf.o
经历了这教程中,我注意到内核模块有命名约定[模块名称].ko为了将它们与用户空间目标文件区分开来。
我的问题是,假设当前 ELF 加载器存在,我该如何将新的(修改后的)ELF 加载器插入到内核中(因为卸载它可能会阻止二进制文件的执行)?
编辑#1:
跑步修改给出:
$ 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 加载器。默认情况下,加载器内置于基本内核中。
答案1
尝试这个:
或者,我通常采用以下方式。这是根据记忆进行的,可能对您有用,也可能没用。它还会构建所有模块。
安装当前内核源:
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。