我用的是linux2.4.18,打好了arm补丁,使用cross2.95.3编译,配置文件选项全是默认。编译时发生:
make[3]: ***
[vgacon.o] 错误 1
make[3]: Leaving directory
`/home/armlinux/drivers/video'
make[2]: *** [first_rule] 错误 2
make[2]:
Leaving directory `/home/armlinux/drivers/video'
make[1]: *** [_subdir_video]
错误 2
make[1]: Leaving directory `/home/armlinux/drivers'
make: ***
[_dir_drivers] 错误 2
我随后去掉console drivers下的vga text
console选项,又出现下列错误:
drivers/char/char.o: In function
`vt_ioctl':
drivers/char/char.o(.text+0xa59): undefined reference to
`key_maps'
drivers/char/char.o(.text+0xa924): undefined reference to
`key_maps'
drivers/char/char.o(.text+0xa92c): undefined reference to
`keymap_count'
drivers/char/char.o(.text+0xa94): undefined reference to
`func_table'
drivers/char/char.o(.text+0xa950): undefined reference to
`funcbufleft'
drivers/char/char.o(.text+0xa954): undefined reference to
`funcbufsize'
drivers/char/char.o(.text+0xa95): undefined reference to
`funcbufptr'
drivers/char/char.o(.text+0xad4c): undefined reference to
`func_table'
drivers/char/char.o(.text+0xad50): undefined reference to
`funcbufsize'
drivers/char/char.o(.text+0xad54): undefined reference to
`funcbufptr'
drivers/char/char.o(.text+0xad5): undefined reference to
`func_buf'
drivers/char/char.o(.text+0xad5c): undefined reference to
`funcbufleft'
drivers/char/char.o(.text+0xad60): undefined reference to
`accent_table_size'
drivers/char/char.o(.text+0xad64): undefined reference to
`accent_table'
drivers/char/char.o: In function
`kbd_processkeycode':
drivers/char/char.o(.text+0x14070): undefined reference
to `key_maps'
drivers/char/char.o: In function
`handle_diacr':
drivers/char/char.o(.text+0x1480c): undefined reference to
`accent_table_size'
drivers/char/char.o(.text+0x14810): undefined reference
to `accent_table'
drivers/char/char.o: In function
`do_fn':
drivers/char/char.o(.text+0x14864): undefined reference to
`func_table'
drivers/char/char.o: In function
`compute_shiftstate':
drivers/char/char.o(.text+0x14c2): undefined reference
to `key_maps'
drivers/char/char.o: In function
`do_slock':
drivers/char/char.o(.text+0x14da): undefined reference to
`key_maps'
make: *** [vmlinux] 错误 1
解决方法(一):
网上的方法:key_maps、func_table、funcbfsize这些变量都是在defkeymap.c中定义的。不过vt.c和
keyboard.c都没有引用defkeymap.c的定义。
在drivers/char/Makefile里检查了一下,ifeq($(ARCH),arm)下面的“KEYMAP
:=”后面是空白就把defkeymap.o填上去了。然后make zImage编译通过。
解决方法(二):
根据方法一可以看出,是defkeymap.c文件没有编译进内核,在drivers/char/Makefile中ifeq($(ARCH),arm)对应的代码下面有几项中有defkeymap.o,只要在make menuconfig配置中选中对应的配置变量即可。
ifeq($(ARCH),arm)
KEYMAP :=(可以在这里加上defkeymap.o,如方法一)
KEYBD :=
ifeq ($(CONFIG_PC_KEYMAP
),y)
KEYMAP := defkeymap.o
endif
ifeq ($(CONFIG_PC_KEYB),y)
KEYBD += pc_keyb.o
endif
ifeq
($(CONFIG_KMI_KEYB),y)
KEYBD +=
amba_kmi_keyb.o
endif
ifeq
($(CONFIG_SA1111),y)
KEYBD +=
sa1111_keyb.o
endif
ifeq
($(CONFIG_ARCH_EDB7211),y)
KEYBD +=
edb7211_keyb.o
endif
ifeq
($(CONFIG_ARCH_AUTCPU12),y)
KEYMAP := defkeymap.o
KEYBD
+= clps711x_keyb.o
endif
例如在配置变量CONFIG_PC_KEYMAP 对应的下面有defkeymap.o,然后在配置菜单文件arch/arm/config.in中,找到CONFIG_PC_KEYMAP变量,如下:
if [ "$CONFIG_FOOTBRIDGE_HOST" = "y" -o
/
"$CONFIG_ARCH_SHARK" = "y" -o
/
"$CONFIG_ARCH_SA1100" = "y" -o
/
"$CONFIG_ARCH_INTEGRATOR" = "y" -o
/
"$CONFIG_ARCH_TBOX" = "y" -o
/
"$CONFIG_ARCH_CLPS7500" = "y" -o
/
"$CONFIG_ARCH_P720T" = "y" -o
/
"$CONFIG_S3C2410_SMDK" = "y" -o
/
"$CONFIG_ARCH_ANAKIN" = "y" ];
then
define_bool CONFIG_PC_KEYMAP
y
fi
从代码可以看出,若要让defkeymap.o编译,则要让CONFIG_PC_KEYMAP
为y。因为我是移植S3C2410的ARM,所以在中间加了
"$CONFIG_S3C2410_SMDK" = "y" -o /
本文详细介绍了在使用Linux 2.4.18版本,结合arm补丁和cross 2.95.3进行内核编译时遇到的错误及其解决方法。包括将consoledrivers下的vgatext console选项移除后仍存在的问题,并通过调整drivers/char/Makefile中的配置变量解决了编译失败的问题。
1118

被折叠的 条评论
为什么被折叠?



