原文地址:http://blog.csdn.net/zanget/article/details/4048111
insmod lcd.ko:
lcd: module has no symbols (stripped?) (加载时候没有符号表,用nm可看的)
原因:lcd这个驱动与板上的内核不相配??
注意有可能不是因为这个原因:
我这里是因为 在生成文件系统的时候,需要把编译成模块的驱动放到文件系统,让系统运行统起来后加载进内核,就是在系统启动好后加载时候出错!!!
原因我也仔细查了哈子,用nm看生成的模块lcd.ko时有符号表的:
[root@Mike modules]# nm lcd.ko
00000000 T cleanup_module
00000064 T CloseLCD
0000010c T clr_screen
U __copy_user
00000244 T disp_screen
00000000 T init_module
0000000c r __kstrtab_CloseLCD
...
但是只要生成文件系统后:
make rootfs
lcd.ko符号表就没有了
[root@Mike modules]# nm lcd.ko
nm: lcd.ko:无符号
这下就晕死了,估计是因为制作文件系统的时候把符号表去掉了:
[root@Mike LDE]# make rootfs
Checking build system dependencies:
sed works: Ok
GNU make version '3.79.1,': Ok
gcc version '3.3.2': Ok
which installed: Ok
bison installed: Ok
flex installed: Ok
gettext installed: Ok
Build system dependencies: Ok
/sbin/ldconfig -r /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root 2>/dev/null
# Use fakeroot to pretend all target binaries are owned by root
rm -f /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
touch /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/.fakeroot.00000
cat /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/.fakeroot* > /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
echo "chown -R root:root /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root" >> /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
# Use fakeroot to pretend to create all needed device nodes
echo "/home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/bin/makedevs -d target/generic/device_table.txt /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root" /
>> /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
# Use fakeroot so mkfs.jffs2 believes the previous fakery
echo "/home/innova/LDE/user/buildroot-20060919-1/toolchain_build_mipsel/mtd_orig/util/mkfs.jffs2 -e 0x10000 -l -d /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root -o /home/innova/LDE/user/buildroot-20060919-1/rootfs.mipsel.jffs2" /
>> /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
chmod a+x /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
/home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/usr/bin/fakeroot -- /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
rootdir=/home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root
table='target/generic/device_table.txt'
-rw-r--r-- 1 root root 1355192 4月 4 11:04 /home/innova/LDE/user/buildroot-20060919-1/rootfs.mipsel.jffs2
注意查看此Makefile文件的执行情况(只需要打印这些数据信息(不执行命令)注1):
- make -qp rootfs > /tmp/Makefile
打开/tmp/Makefile,根据前面的打印信息:
- [root@Mike LDE]# make rootfs
- Checking build system dependencies:
- sed works: Ok
- GNU make version '3.79.1,': Ok
- gcc version '3.3.2': Ok
- which installed: Ok
- bison installed: Ok
- flex installed: Ok
- gettext installed: Ok
- Build system dependencies: Ok
- /sbin/ldconfig -r /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root 2>/dev/null
- # Use fakeroot to pretend all target binaries are owned by root
- rm –f /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
- touch /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/.fakeroot.00000
- cat /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/.fakeroot* > /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
- echo "chown -R root:root /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root" >> /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
- # Use fakeroot to pretend to create all needed device nodes
- echo "/home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/bin/makedevs -d target/generic/device_table.txt /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root" /
- >> /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
- # Use fakeroot so mkfs.jffs2 believes the previous fakery
- echo "/home/innova/LDE/user/buildroot-20060919-1/toolchain_build_mipsel/mtd_orig/util/mkfs.jffs2 -e 0x10000 -l -d /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root -o /home/innova/LDE/user/buildroot-20060919-1/rootfs.mipsel.jffs2" /
- >> /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
- chmod a+x /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
- /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/usr/bin/fakeroot -- /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2
- rootdir=/home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root table='target/generic/device_table.txt'
- -rw-r--r-- 1 root root 1355192 4月 5 21:27 /home/innova/LDE/user/buildroot-20060919-1/rootfs.mipsel.jffs2
先定位第一行:/sbin/ldconfig
在/tmp/Makefile中仔细搜素"/sbin/ldconfig",得到:
- /home/innova/LDE/user/buildroot-20060919-1/rootfs.mipsel.jffs2: host-fakeroot makedevs mtd-host
- ...(注释省略)
- # commands to execute (from `target/jffs2/jffs2root.mk', line 43):
- -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true;
- @rm -rf $(TARGET_DIR)/usr/man
- @rm -rf $(TARGET_DIR)/usr/share/man
- ...(注释省略)
注意这行信息:
-@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true;
先确定$(STRIP)的值,在调试目标文件/tmp/Makefile中搜索STRIP,得到
- STRIP = $(TARGET_CROSS)strip --remove-section=.comment --remove-section=.note
即所要找的"去掉符号表"!!! 这句话的含义是: 在目标文件夹中搜索 类型为f 并且文件掩码含有可执行位的文件,注意这里的“可执行位”是指“只要有都匹配这种格式”,去掉符号表
-perm +111的含义是(参考man find)
perm +mode:Any of the permission bits mode are set for the file.
然后找到命令定义所在文件,注意看这行信息
- commands to execute (from `target/jffs2/jffs2root.mk', line 43):
打开文件 target/jffs2/jffs2root.mk,定位到line 43,find
果然有:
好了大展拳脚吧!!!嘿嘿 改上面的一行为
- @#old command is:(modify by zanget,because we need the symb)
- @#-@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true;
- -find $(TARGET_DIR) -type f -perm +111 -type f ! -name "*.ko" -type f ! -name "*.so" 2>/dev/null | xargs $(STRIP) || true;
这样我们生成的*.so,*.ko不管文件掩码为什么都不会被去掉符号表了!
哈哈哈
注1:
参阅http://www.linuxsir.org/main/doc/gnumake/GNUmake_v3.80-zh_CN_html/make-09.html
-p
--print-data-base
命令执行之前,打印出make读取的Makefile的所有数据(包括规则和变量的值),同时打印出make的版本信息。如果只需要打印这些数据信息(不执行命令)可以使用“make -qp”命令。查看make执行
前的预设规则和变量,可使用命令“make –p -f /dev/null”。