insmod lcd.ko:module has no symbols (stripped?) .

来源:互联网 发布:linux mint 17 输入法 编辑:程序博客网 时间:2024/05/29 03:18

原文地址: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):

[c-sharp] view plaincopyprint?
  1. make -qp rootfs > /tmp/Makefile  

打开/tmp/Makefile,根据前面的打印信息:

[c-sharp] view plaincopyprint?
  1. [root@Mike LDE]# make rootfs  
  2. Checking build system dependencies:  
  3. sed works:                          Ok  
  4. GNU make version '3.79.1,':         Ok  
  5. gcc version '3.3.2':                Ok  
  6. which installed:                    Ok  
  7. bison installed:                    Ok  
  8. flex installed:                     Ok  
  9. gettext installed:                  Ok  
  10. Build system dependencies:          Ok  
  11. /sbin/ldconfig -r /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root 2>/dev/null 
  12. # Use fakeroot to pretend all target binaries are owned by root   
  13. rm –f  /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2  
  14. touch /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/.fakeroot.00000  
  15. 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  
  16. 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  
  17.  
  18. # Use fakeroot to pretend to create all needed device nodes   
  19. 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" /  
  20. >> /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2  
  21. # Use fakeroot so mkfs.jffs2 believes the previous fakery   
  22. 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" /  
  23.     >> /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2  
  24. chmod a+x /home/innova/LDE/user/buildroot-20060919-1/build_mipsel/staging_dir/_fakeroot.rootfs.mipsel.jffs2  
  25. /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  
  26. rootdir=/home/innova/LDE/user/buildroot-20060919-1/build_mipsel/root table='target/generic/device_table.txt'  
  27.   
  28. -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",得到:

 

 

[c-sharp] view plaincopyprint?
  1. /home/innova/LDE/user/buildroot-20060919-1/rootfs.mipsel.jffs2: host-fakeroot makedevs mtd-host  
  2. ...(注释省略)  
  3. #  commands to execute (from `target/jffs2/jffs2root.mk', line 43):   
  4.        -@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true;  
  5.        @rm -rf $(TARGET_DIR)/usr/man  
  6.        @rm -rf $(TARGET_DIR)/usr/share/man  
  7. ...(注释省略)  

注意这行信息:

-@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true;

 先确定$(STRIP)的值,在调试目标文件/tmp/Makefile中搜索STRIP,得到

 

[c-sharp] view plaincopyprint?
  1. 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.

 

然后找到命令定义所在文件,注意看这行信息

[c-sharp] view plaincopyprint?
  1. commands to execute (from `target/jffs2/jffs2root.mk', line 43):  

打开文件 target/jffs2/jffs2root.mk,定位到line 43,find

果然有:

 

 

好了大展拳脚吧!!!嘿嘿 改上面的一行为

 

[c-sharp] view plaincopyprint?
  1. @#old command is:(modify by zanget,because we need the symb)  
  2. @#-@find $(TARGET_DIR) -type f -perm +111 | xargs $(STRIP) 2>/dev/null || true;  
  3. -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”。

原创粉丝点击