nanzh

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

本节是关于生成设备节点。

学习资料来源于迅为的视频学习教程的整理

 

1.区分概念:

    设备注册:platform_device,查看:/sys/devices/platform

    驱动注册:platform_driver

    生成设备节点:为了让应用程序可以调用,是"对上"的接口。

                             与设备注册无关,设备节点名称不需要与设备名称相同。查看:/dev/*

                             一般将设备节点的注册放在probe中,也可以放到init函数中。

    杂项设备,或者说是对一部分字符设备的封装或者一部分不好分类的。

    可以节省主设备号,驱动写起来相对简单(用封装好的杂项设备可以减少一步注册主设备号的过程)

Linux设备驱动一般分为:字符设备,块设备,网络设备。也可以按照子系统来分类,如:mm,led等

2.源代码位置

    杂项设备初始化源代码:/drivers/char/misc.c,属于内核中强制编译的。

    杂项设备注册头文件:include/linux/miscdevice.h,主要的结构体为miscdevice

 1 struct miscdevice  {
 2         int minor;     //设备号,一般系统分配随机取值
 3         const char *name;     //生成设备节点的名称,无限制
 4         const struct file_operations *fops;     //指向一个设备节点文件,对文件的操作
 5         struct list_head list;
 6         struct device *parent;
 7         struct device *this_device;
 8         const char *nodename;
 9         mode_t mode;
10 };
11 
12 extern int misc_register(struct miscdevice * misc);    //生成设备节点的函数,一般在probe中被调用
13 extern int misc_deregister(struct miscdevice *misc);

     设备节点本质是文件一个特殊文件,包括文件名,打开关闭等,文件结构体的头文件为include/linux/fs.h,结构体为file_operations

 1 //相当重要的结构体
 2 /*
 3  * NOTE:
 4  * all file operations except setlease can be called without
 5  * the big kernel lock held in all filesystems.
 6  */
 7 struct file_operations {
 8         struct module *owner;        //必选参数,一般是THIS_MODULE
 9         loff_t (*llseek) (struct file *, loff_t, int);
10         ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
11         ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
12         ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
13         ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
14         int (*readdir) (struct file *, void *, filldir_t);
15         unsigned int (*poll) (struct file *, struct poll_table_struct *);
16 /* remove by cym 20130408 support for MT660.ko */
17 #if 0
18 //#ifdef CONFIG_SMM6260_MODEM
19 #if 1// liang, Pixtree also need to use ioctl interface...
20         int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
21 #endif
22 #endif
23 /* end remove */
24         long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);     //非必选,对GPIO操作,应用向底层驱动传值的
25         long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
26         int (*mmap) (struct file *, struct vm_area_struct *);
27         int (*open) (struct inode *, struct file *);            //必选的参数,打开文件函数
28         int (*flush) (struct file *, fl_owner_t id);
29         int (*release) (struct inode *, struct file *);          //必选的参数,关闭文件函数
30         int (*fsync) (struct file *, int datasync);
31         int (*aio_fsync) (struct kiocb *, int datasync);
32         int (*fasync) (int, struct file *, int);
33         int (*lock) (struct file *, int, struct file_lock *);
34         ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int);
35         unsigned long (*get_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long);
36         int (*check_flags)(int);
37         int (*flock) (struct file *, int, struct file_lock *);
38         ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, size_t, unsigned int);
39         ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, size_t, unsigned int);
40         int (*setlease)(struct file *, long, struct file_lock **);
41         long (*fallocate)(struct file *file, int mode, loff_t offset,
42                           loff_t len);
43 /* add by cym 20130408 support for MT6260 and Pixtree */
44 #if defined(CONFIG_SMM6260_MODEM) || defined(CONFIG_USE_GPIO_AS_I2C)
45         int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);    //此处ioctl与上面的不一样
46 #endif
47 /* end add */
48 };

3. 驱动代码案例

 在probe_linux_module基础上写devicenode_linux_module驱动,注意函数调用顺序,/dev下查看

devicenode_linux_module.c

 1 #include <linux/init.h>
 2 #include <linux/module.h>
 3 #include <linux/platform_device.h>
 4 //misc
 5 #include <linux/miscdevice.h>
 6 //注册设备节点的文件结构体
 7 #include <linux/fs.h>
 8 
 9 #define DRIVER_NAME "hello_ctl"
10 #define DEVICE_NAME "hello_ctl123"
11 
12 static int hello_open(struct inode *inode, struct file *file){
13     printk(KERN_EMERG "hello open\n");        //调用步骤4-1
14     return 0;
15 }
16 static int hello_release(struct inode *inode, struct file *file){
17     printk(KERN_EMERG "hello release\n");        //调用步骤4-2
18     return 0;
19 }
20 static long hello_ioctl(struct file *file, unsigned int cmd, unsigned long arg){
21     //打开之后操作的,所以参数里面不需要inode
22     printk(KERN_EMERG "hello ioctl\n");           //调用步骤4-3
23     printk("cmd is %d, arg is %d\n", cmd, arg);
24     return 0;
25 }
26 //文件设备操作结构体
27 static struct file_operations hello_ops = {
28     .owner = THIS_MODULE,
29      // int (*open) (struct inode *, struct file *);     
30     .open = hello_open,                     //调用步骤3-1
31          // int (*release) (struct inode *, struct file *)
32     .release = hello_release,               //调用步骤3-2
33      // long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
34     .unlocked_ioctl = hello_ioctl,          //调用步骤3-3
35 };
36 //杂项设备结构体
37 static struct miscdevice hello_dev = {
38     .minor = MISC_DYNAMIC_MINOR,
39     .name = DEVICE_NAME,
40     .fops = &hello_ops,       //调用步骤2
41 };
42 
43 
44 static int hello_probe(struct platform_device *pdv){
45     printk(KERN_EMERG "initialized\n");
46     misc_register(&hello_dev);      //一般在probe中调用.调用步骤1
47     return 0;
48 }
49 static int hello_remove(struct platform_device *pdv){
50     printk(KERN_EMERG "remove\n");
51     misc_deregister(&hello_dev);
52     return 0;
53 }
54 static void hello_shutdown(struct platform_device *pdv){
55     ;
56 }
57 static int hello_suspend(struct platform_device *pdv, pm_message_t pmt){
58     return 0;
59 }
60 static int hello_resume(struct platform_device *pdev){
61     return 0;
62 }
63 
64 struct platform_driver hello_driver = {
65     .probe = hello_probe,
66     .remove = hello_remove,
67     .shutdown = hello_shutdown,
68     .suspend = hello_suspend,
69     .resume = hello_resume,
70     .driver = {
71         .name = DRIVER_NAME,
72         .owner = THIS_MODULE,
73     }
74 };
75 
76 static int hello_init(void)
77 {
78     int DriverState;
79     printk(KERN_EMERG "hello world enter!\n");
80     DriverState=platform_driver_register(&hello_driver);
81     printk(KERN_EMERG "DriverState is %d\n", DriverState);
82         return 0;
83 }
84 
85 static void hello_exit(void)
86 {
87     printk(KERN_EMERG "hello world exit!\n");
88     platform_driver_unregister(&hello_driver); //unregister会查找release,如果找不到会报错
89 }
90 
91 module_init(hello_init);
92 module_exit(hello_exit);
93 
94 MODULE_LICENSE("Dual BSD/GPL");
95 MODULE_AUTHOR("NANZH");

Makefile

 1 obj-m += devicenode_linux_module.o
 2 
 3 KDIR := /home/nan/iTOP4412/iTop4412_Kernel_3.0
 4 
 5 PWD ?= $(shell pwd)
 6 
 7 all:
 8   make -C $(KDIR) M=$(PWD) modules 
 9 
10 clean:
11   rm -rf *.o

测试结果:

 1 # 板子上:
 2 root@iTOP4412-ubuntu-desktop:# insmod devicenode_linux_module.ko 
 3 [  112.202074] hello world enter!
 4 [  112.203980] initialized
 5 [  112.236250] DriverState is 0
 6 查看生成的设备节点:
 7 root@iTOP4412-ubuntu-desktop:# ls -l /dev/hello_ctl123 
 8 crw------- 1 root root 10, 46 Nov 22 05:55 /dev/hello_ctl123
 9 root@iTOP4412-ubuntu-desktop:# rmmod devicenode_linux_module
10 [  136.243713] hello world exit!
11 [  136.246474] remove

以上

 

继编写简单的应用来调用设备节点:

根据上面生成的/dev/hello_ctl123节点来调用,基于应用层的,所以使用基本的C文件形式。

4. 函数头文件

    # include <stdio.h>     //printf

    # include <sys/types.h>   //基本系统数据类型,依据编译环境保持32位值还是64位值

    # include <sys/stat.h>    //系统调用头文件,如目录、管道、socket、字符、块的属性等

    # include <fcntl.h>    //定义了open函数

    # include <unistd>   //定义了close函数

    # include <sys/ioctl.h>    //定义了ioctl函数

编译器使用的是arm-2009q3,即arm-none-linux-gnueabi-gcc。编译使用的头文件在编译器的libc下,如:

    /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/usr/include/fcntl.h

5. 函数

    open:返回文件描述符

    ioctl:应用向驱动传值

    close:关闭文件

编译方法:arm-none-linux-gnueabi-gcc -o invoke_hello123 invoke_hello123.c

6.详细的C文件:invoke_hello123.c

 

 1 #include <stdio.h>
 2 #include <sys/types.h>
 3 #include <sys/stat.h>
 4 #include <fcntl.h>
 5 #include <unistd.h>
 6 #include <sys/ioctl.h>
 7 
 8 int main()
 9 {
10     int fd;
11     char *hello_node = "/dev/hello_ctl123";  //设备节点的路径
12 
13     fd = open(hello_node, O_RDWR|O_NDELAY);  //只读,非阻塞方式
14     if (fd < 0)
15         perror("open");
16     else{
17         printf("App open %s success\n",hello_node);
18         ioctl(fd, 1, 6);
19     }
20 
21     close(fd);
22     return 0;
23 }

编译完成之后将编译产物invoke_hello123拷贝至开发板中运行,正确运行结果如下:

查看运行结果:

 1 root@iTOP4412-ubuntu-desktop:~/tests/3# insmod devicenode_linux_module.ko 
 2 [ 1856.029716] hello world enter!
 3 [ 1856.040410] initialized
 4 [ 1856.068655] DriverState is 0
 5 root@iTOP4412-ubuntu-desktop:~/tests/3# ls /dev/hello_ctl123 
 6 /dev/hello_ctl123
 7 root@iTOP4412-ubuntu-desktop:~/tests/3# ls -l /dev/hello_ctl123 
 8 crw------- 1 root root 10, 46 Nov 22 07:29 /dev/hello_ctl123
 9 root@iTOP4412-ubuntu-desktop:~/tests/3# ./invoke_hello123 
10 [ 1871.946816] hello open
11 [ 1871.948367] hello ioctl
12 App open /dev/hello_ctl123 success
13 [ 1871.960204] hello release
14 root@iTOP4412-ubuntu-desktop:~/tests/3# rmmod devicenode_linux_module
15 [ 1880.317030] hello world exit!
16 [ 1880.318624] remove

dmesg中含有hello_ioctl调用的打印信息,上面没有直接打印出来,在dmesg中有。
[   65.291707] hello world enter!
[   65.293621] initialized
[   65.321764] DriverState is 0
[   69.906179] hello open
[   69.930525] hello ioctl
[   69.932853] cmd is 1, arg is 6
[   69.932905] hello release

 

在开发板上运行./invoke_hello123出错的log和解决如下:

# ERROR
root@iTOP4412-ubuntu-desktop:~/tests/3# ./invoke_hello123 
-bash: ./invoke_hello123: No such file or directory
解决方法:https://blog.csdn.net/qq_22863619/article/details/80294232
iTOP4412-ubuntu-desktop:~/tests/3# readelf -a invoke_hello123  | grep Requesting 
      [Requesting program interpreter: /lib/ld-linux.so.3]

由此发现缺少的是库文件:/lib/ld-linux.so.3
遂到toolchain中查找:
nan@nanzh:~/iTOP4412/4-1$ find /usr/local/arm/arm-2009q3/ -iname "ld-linux.so.3"
/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/ld-linux.so.3
/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/thumb2/lib/ld-linux.so.3
/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib/ld-linux.so.3
nan@nanzh:~/iTOP4412/4-1$ ls -l /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/ld-linux.so.3
lrwxrwxrwx 1 nan nan 12 10月 17  2009 /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/ld-linux.so.3 -> ld-2.10.1.so
于是将ld-2.10.1.so拷贝到开发板中并设置软连接
root@iTOP4412-ubuntu-desktop:# cp /mnt/ld-2.10.1.so /lib
root@iTOP4412-ubuntu-desktop:/lib# ln -s ld-2.10.1.so ld-linux.so.3

#ERROR 2
root@iTOP4412-ubuntu-desktop:~/tests/3# ./invoke_hello123 
./invoke_hello123: error while loading shared libraries: libgcc_s.so.1: cannot open shared object file: No such file or directory
方法:
nan@nanzh:~/iTOP4412/4-1$ find /usr/local/arm/arm-2009q3/ -iname "libgcc_s.so.1"
/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/libgcc_s.so.1
/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/thumb2/lib/libgcc_s.so.1
/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib/libgcc_s.so.1
nan@nanzh:~/iTOP4412/4-1$ ls -l /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/libgcc_s.so.1
-rw-r--r-- 1 nan nan 69371 10月 17  2009 /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/libgcc_s.so.1
拷贝到板子上继续
root@iTOP4412-ubuntu-desktop:~/tests/3# cp /mnt/libgcc_s.so.1 /lib/
root@iTOP4412-ubuntu-desktop:~/tests/3# ./invoke_hello123 
./invoke_hello123: error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory

nan@nanzh:~/iTOP4412/4-1$ find /usr/local/arm/arm-2009q3/ -iname "libc.so.6"
/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/libc.so.6
/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/thumb2/lib/libc.so.6
/usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/armv4t/lib/libc.so.6
nan@nanzh:~/iTOP4412/4-1$ ls -l /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/libc.so.6
lrwxrwxrwx 1 nan nan 14 10月 17  2009 /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/libc.so.6 -> libc-2.10.1.so
root@iTOP4412-ubuntu-desktop:~/tests/3# mount /dev/sdb3 /mnt
root@iTOP4412-ubuntu-desktop:~/tests/3# cp /mnt/libc-2.10.1.so /lib
root@iTOP4412-ubuntu-desktop:~/tests/3# cd /lib
root@iTOP4412-ubuntu-desktop:/lib# ln -s libc-2.10.1.so libc.so.6

以上总结,缺少库:/lib/ld-linux.so.3,libgcc_s.so.1,libc.so.6

使用readelf查看的具体内容如下。(ldd用于动态库)

root@iTOP4412-ubuntu-desktop:~/tests/3# readelf -a invoke_hello123 
ELF Header:
  Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 
  Class:                             ELF32
  Data:                              2's complement, little endian
  Version:                           1 (current)
  OS/ABI:                            UNIX - System V
  ABI Version:                       0
  Type:                              EXEC (Executable file)
  Machine:                           ARM
  Version:                           0x1
  Entry point address:               0x8440
  Start of program headers:          52 (bytes into file)
  Start of section headers:          2488 (bytes into file)
  Flags:                             0x5000002, has entry point, Version5 EABI
  Size of this header:               52 (bytes)
  Size of program headers:           32 (bytes)
  Number of program headers:         8
  Size of section headers:           40 (bytes)
  Number of section headers:         31
  Section header string table index: 28

Section Headers:
  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        00008134 000134 000013 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            00008148 000148 000020 00   A  0   0  4
  [ 3] .hash             HASH            00008168 000168 000044 04   A  4   0  4
  [ 4] .dynsym           DYNSYM          000081ac 0001ac 0000c0 10   A  5   1  4
  [ 5] .dynstr           STRTAB          0000826c 00026c 0000b3 00   A  0   0  1
  [ 6] .gnu.version      VERSYM          00008320 000320 000018 02   A  4   0  2
  [ 7] .gnu.version_r    VERNEED         00008338 000338 000040 00   A  5   2  4
  [ 8] .rel.dyn          REL             00008378 000378 000008 08   A  4   0  4
  [ 9] .rel.plt          REL             00008380 000380 000040 08   A  4  11  4
  [10] .init             PROGBITS        000083c0 0003c0 00000c 00  AX  0   0  4
  [11] .plt              PROGBITS        000083cc 0003cc 000074 04  AX  0   0  4
  [12] .text             PROGBITS        00008440 000440 000204 00  AX  0   0  4
  [13] .fini             PROGBITS        00008644 000644 000008 00  AX  0   0  4
  [14] .rodata           PROGBITS        0000864c 00064c 000038 00   A  0   0  4
  [15] .ARM.extab        PROGBITS        00008684 000684 000018 00   A  0   0  4
  [16] .ARM.exidx        ARM_EXIDX       0000869c 00069c 000038 00  AL 12   0  4
  [17] .eh_frame         PROGBITS        000086d4 0006d4 000004 00   A  0   0  4
  [18] .init_array       INIT_ARRAY      000106d8 0006d8 000004 00  WA  0   0  4
  [19] .fini_array       FINI_ARRAY      000106dc 0006dc 000004 00  WA  0   0  4
  [20] .jcr              PROGBITS        000106e0 0006e0 000004 00  WA  0   0  4
  [21] .dynamic          DYNAMIC         000106e4 0006e4 0000f0 08  WA  5   0  4
  [22] .got              PROGBITS        000107d4 0007d4 000030 04  WA  0   0  4
  [23] .data             PROGBITS        00010804 000804 000008 00  WA  0   0  4
  [24] .bss              NOBITS          0001080c 00080c 000004 00  WA  0   0  1
  [25] .ARM.attributes   ARM_ATTRIBUTES  00000000 00080c 000029 00      0   0  1
  [26] .comment          PROGBITS        00000000 000835 00002a 00      0   0  1
  [27] .debug_frame      PROGBITS        00000000 000860 00004c 00      0   0  4
  [28] .shstrtab         STRTAB          00000000 0008ac 00010b 00      0   0  1
  [29] .symtab           SYMTAB          00000000 000e90 0006f0 10     30  81  4
  [30] .strtab           STRTAB          00000000 001580 0002d9 00      0   0  1
Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

There are no section groups in this file.

Program Headers:
  Type           Offset   VirtAddr   PhysAddr   FileSiz MemSiz  Flg Align
  EXIDX          0x00069c 0x0000869c 0x0000869c 0x00038 0x00038 R   0x4
  PHDR           0x000034 0x00008034 0x00008034 0x00100 0x00100 R E 0x4
  INTERP         0x000134 0x00008134 0x00008134 0x00013 0x00013 R   0x1
      [Requesting program interpreter: /lib/ld-linux.so.3]
  LOAD           0x000000 0x00008000 0x00008000 0x006d8 0x006d8 R E 0x8000
  LOAD           0x0006d8 0x000106d8 0x000106d8 0x00134 0x00138 RW  0x8000
  DYNAMIC        0x0006e4 0x000106e4 0x000106e4 0x000f0 0x000f0 RW  0x4
  NOTE           0x000148 0x00008148 0x00008148 0x00020 0x00020 R   0x4
  GNU_STACK      0x000000 0x00000000 0x00000000 0x00000 0x00000 RW  0x4

 Section to Segment mapping:
  Segment Sections...
   00     .ARM.exidx 
   01     
   02     .interp 
   03     .interp .note.ABI-tag .hash .dynsym .dynstr .gnu.version .gnu.version_r .rel.dyn .rel.plt .init .plt .text .fini .rodata .ARM.extab .ARM.exidx .eh_frame 
   04     .init_array .fini_array .jcr .dynamic .got .data .bss 
   05     .dynamic 
   06     .note.ABI-tag 
   07     

Dynamic section at offset 0x6e4 contains 25 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.6]
 0x0000000c (INIT)                       0x83c0
 0x0000000d (FINI)                       0x8644
 0x00000019 (INIT_ARRAY)                 0x106d8
 0x0000001b (INIT_ARRAYSZ)               4 (bytes)
 0x0000001a (FINI_ARRAY)                 0x106dc
 0x0000001c (FINI_ARRAYSZ)               4 (bytes)
 0x00000004 (HASH)                       0x8168
 0x00000005 (STRTAB)                     0x826c
 0x00000006 (SYMTAB)                     0x81ac
 0x0000000a (STRSZ)                      179 (bytes)
 0x0000000b (SYMENT)                     16 (bytes)
 0x00000015 (DEBUG)                      0x0
 0x00000003 (PLTGOT)                     0x107d4
 0x00000002 (PLTRELSZ)                   64 (bytes)
 0x00000014 (PLTREL)                     REL
 0x00000017 (JMPREL)                     0x8380
 0x00000011 (REL)                        0x8378
 0x00000012 (RELSZ)                      8 (bytes)
 0x00000013 (RELENT)                     8 (bytes)
 0x6ffffffe (VERNEED)                    0x8338
 0x6fffffff (VERNEEDNUM)                 2
 0x6ffffff0 (VERSYM)                     0x8320
 0x00000000 (NULL)                       0x0

Relocation section '.rel.dyn' at offset 0x378 contains 1 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
00010800  00000515 R_ARM_GLOB_DAT    00000000   __gmon_start__

Relocation section '.rel.plt' at offset 0x380 contains 8 entries:
 Offset     Info    Type            Sym.Value  Sym. Name
000107e0  00000116 R_ARM_JUMP_SLOT   000083e0   open
000107e4  00000216 R_ARM_JUMP_SLOT   000083ec   abort
000107e8  00000316 R_ARM_JUMP_SLOT   000083f8   __libc_start_main
000107ec  00000516 R_ARM_JUMP_SLOT   00000000   __gmon_start__
000107f0  00000716 R_ARM_JUMP_SLOT   00008410   perror
000107f4  00000816 R_ARM_JUMP_SLOT   0000841c   ioctl
000107f8  00000916 R_ARM_JUMP_SLOT   00008428   printf
000107fc  00000a16 R_ARM_JUMP_SLOT   00008434   close

Unwind table index '.ARM.exidx' at offset 0x69c contains 7 entries:

0x8440 <_start>: 0x1 [cantunwind]

0x84a0 <__do_global_dtors_aux>: 0x80b0b0b0
  Compact model 0
  0xb0      finish
  0xb0      finish
  0xb0      finish

0x84bc <frame_dummy>: @0x8684
  Compact model 1
  0xb1 0x08 pop {r3}
  0x84 0x00 pop {r14}
  0xb0      finish
  0xb0      finish

0x84ec <main>: @0x8690
  Compact model 1
  0x9b      vsp = r11
  0x40      vsp = vsp - 4
  0x84 0x80 pop {r11, r14}
  0xb0      finish
  0xb0      finish

0x8574 <__libc_csu_fini>: 0x80b0b0b0
  Compact model 0
  0xb0      finish
  0xb0      finish
  0xb0      finish

0x8578 <__libc_csu_init>: 0x80aeb0b0
  Compact model 0
  0xae      pop {r4, r5, r6, r7, r8, r9, r10r14}
  0xb0      finish
  0xb0      finish

0x8644 <_fini>: 0x1 [cantunwind]


Symbol table '.dynsym' contains 12 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 000083e0     0 FUNC    GLOBAL DEFAULT  UND open@GLIBC_2.4 (2)
     2: 000083ec     0 FUNC    GLOBAL DEFAULT  UND abort@GLIBC_2.4 (2)
     3: 000083f8     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.4 (2)
     4: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_unwind_cpp_pr0@GCC_3.5 (3)
     5: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
     6: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
     7: 00008410     0 FUNC    GLOBAL DEFAULT  UND perror@GLIBC_2.4 (2)
     8: 0000841c     0 FUNC    GLOBAL DEFAULT  UND ioctl@GLIBC_2.4 (2)
     9: 00008428     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.4 (2)
    10: 00008434     0 FUNC    GLOBAL DEFAULT  UND close@GLIBC_2.4 (2)
    11: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_unwind_cpp_pr1@GCC_3.5 (3)

Symbol table '.symtab' contains 111 entries:
   Num:    Value  Size Type    Bind   Vis      Ndx Name
     0: 00000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 00008134     0 SECTION LOCAL  DEFAULT    1 
     2: 00008148     0 SECTION LOCAL  DEFAULT    2 
     3: 00008168     0 SECTION LOCAL  DEFAULT    3 
     4: 000081ac     0 SECTION LOCAL  DEFAULT    4 
     5: 0000826c     0 SECTION LOCAL  DEFAULT    5 
     6: 00008320     0 SECTION LOCAL  DEFAULT    6 
     7: 00008338     0 SECTION LOCAL  DEFAULT    7 
     8: 00008378     0 SECTION LOCAL  DEFAULT    8 
     9: 00008380     0 SECTION LOCAL  DEFAULT    9 
    10: 000083c0     0 SECTION LOCAL  DEFAULT   10 
    11: 000083cc     0 SECTION LOCAL  DEFAULT   11 
    12: 00008440     0 SECTION LOCAL  DEFAULT   12 
    13: 00008644     0 SECTION LOCAL  DEFAULT   13 
    14: 0000864c     0 SECTION LOCAL  DEFAULT   14 
    15: 00008684     0 SECTION LOCAL  DEFAULT   15 
    16: 0000869c     0 SECTION LOCAL  DEFAULT   16 
    17: 000086d4     0 SECTION LOCAL  DEFAULT   17 
    18: 000106d8     0 SECTION LOCAL  DEFAULT   18 
    19: 000106dc     0 SECTION LOCAL  DEFAULT   19 
    20: 000106e0     0 SECTION LOCAL  DEFAULT   20 
    21: 000106e4     0 SECTION LOCAL  DEFAULT   21 
    22: 000107d4     0 SECTION LOCAL  DEFAULT   22 
    23: 00010804     0 SECTION LOCAL  DEFAULT   23 
    24: 0001080c     0 SECTION LOCAL  DEFAULT   24 
    25: 00000000     0 SECTION LOCAL  DEFAULT   25 
    26: 00000000     0 SECTION LOCAL  DEFAULT   26 
    27: 00000000     0 SECTION LOCAL  DEFAULT   27 
    28: 0000847c     0 NOTYPE  LOCAL  DEFAULT   12 $a
    29: 0000847c     0 FUNC    LOCAL  DEFAULT   12 call_gmon_start
    30: 00008498     0 NOTYPE  LOCAL  DEFAULT   12 $d
    31: 000083c0     0 NOTYPE  LOCAL  DEFAULT   10 $a
    32: 00008644     0 NOTYPE  LOCAL  DEFAULT   13 $a
    33: 00008148     0 NOTYPE  LOCAL  DEFAULT    2 $d
    34: 00008440     0 NOTYPE  LOCAL  DEFAULT   12 $a
    35: 0000869c     0 NOTYPE  LOCAL  DEFAULT   16 $d
    36: 00008470     0 NOTYPE  LOCAL  DEFAULT   12 $d
    37: 00000000     0 FILE    LOCAL  DEFAULT  ABS init.c
    38: 0000864c     0 NOTYPE  LOCAL  DEFAULT   14 $d
    39: 000083c8     0 NOTYPE  LOCAL  DEFAULT   10 $a
    40: 00008648     0 NOTYPE  LOCAL  DEFAULT   13 $a
    41: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    42: 000106e0     0 OBJECT  LOCAL  DEFAULT   20 __JCR_LIST__
    43: 00010808     0 NOTYPE  LOCAL  DEFAULT   23 $d
    44: 000084a0     0 NOTYPE  LOCAL  DEFAULT   12 $a
    45: 000084a0     0 FUNC    LOCAL  DEFAULT   12 __do_global_dtors_aux
    46: 000084b8     0 NOTYPE  LOCAL  DEFAULT   12 $d
    47: 0001080c     1 OBJECT  LOCAL  DEFAULT   24 completed.6082
    48: 000086a4     0 NOTYPE  LOCAL  DEFAULT   16 $d
    49: 000106dc     0 NOTYPE  LOCAL  DEFAULT   19 $d
    50: 000106dc     0 OBJECT  LOCAL  DEFAULT   19 __do_global_dtors_aux_fin
    51: 000084bc     0 NOTYPE  LOCAL  DEFAULT   12 $a
    52: 000084bc     0 FUNC    LOCAL  DEFAULT   12 frame_dummy
    53: 000084e4     0 NOTYPE  LOCAL  DEFAULT   12 $d
    54: 00008684     0 NOTYPE  LOCAL  DEFAULT   15 $d
    55: 000106d8     0 NOTYPE  LOCAL  DEFAULT   18 $d
    56: 000106d8     0 OBJECT  LOCAL  DEFAULT   18 __frame_dummy_init_array_
    57: 0001080c     0 NOTYPE  LOCAL  DEFAULT   24 $d
    58: 00000000     0 FILE    LOCAL  DEFAULT  ABS invoke_hello123.c
    59: 00008650     0 NOTYPE  LOCAL  DEFAULT   14 $d
    60: 000084ec     0 NOTYPE  LOCAL  DEFAULT   12 $a
    61: 00008564     0 NOTYPE  LOCAL  DEFAULT   12 $d
    62: 00008690     0 NOTYPE  LOCAL  DEFAULT   15 $d
    63: 000086b4     0 NOTYPE  LOCAL  DEFAULT   16 $d
    64: 00000000     0 FILE    LOCAL  DEFAULT  ABS elf-init.c
    65: 00008574     0 NOTYPE  LOCAL  DEFAULT   12 $a
    66: 000086bc     0 NOTYPE  LOCAL  DEFAULT   16 $d
    67: 00008638     0 NOTYPE  LOCAL  DEFAULT   12 $d
    68: 00000010     0 NOTYPE  LOCAL  DEFAULT   27 $d
    69: 00000000     0 FILE    LOCAL  DEFAULT  ABS crtstuff.c
    70: 000086d4     0 NOTYPE  LOCAL  DEFAULT   17 $d
    71: 000086d4     0 OBJECT  LOCAL  DEFAULT   17 __FRAME_END__
    72: 000106e0     0 NOTYPE  LOCAL  DEFAULT   20 $d
    73: 000106e0     0 OBJECT  LOCAL  DEFAULT   20 __JCR_END__
    74: 000107d4     0 OBJECT  LOCAL  HIDDEN    22 _GLOBAL_OFFSET_TABLE_
    75: 000106dc     0 NOTYPE  LOCAL  HIDDEN    18 __init_array_end
    76: 000106d8     0 NOTYPE  LOCAL  HIDDEN    18 __init_array_start
    77: 000106e4     0 OBJECT  LOCAL  HIDDEN    21 _DYNAMIC
    78: 000083cc     0 NOTYPE  LOCAL  DEFAULT   11 $a
    79: 000083dc     0 NOTYPE  LOCAL  DEFAULT   11 $d
    80: 000083e0     0 NOTYPE  LOCAL  DEFAULT   11 $a
    81: 00010804     0 NOTYPE  WEAK   DEFAULT   23 data_start
    82: 000083e0     0 FUNC    GLOBAL DEFAULT  UND open@@GLIBC_2.4
    83: 000083ec     0 FUNC    GLOBAL DEFAULT  UND abort@@GLIBC_2.4
    84: 00008574     4 FUNC    GLOBAL DEFAULT   12 __libc_csu_fini
    85: 00008440     0 FUNC    GLOBAL DEFAULT   12 _start
    86: 000083f8     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@@GLIBC_
    87: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_unwind_cpp_pr0@@G
    88: 00000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
    89: 00000000     0 NOTYPE  WEAK   DEFAULT  UND _Jv_RegisterClasses
    90: 00008644     0 FUNC    GLOBAL DEFAULT   13 _fini
    91: 00008410     0 FUNC    GLOBAL DEFAULT  UND perror@@GLIBC_2.4
    92: 0000864c     4 OBJECT  GLOBAL DEFAULT   14 _IO_stdin_used
    93: 00010804     0 NOTYPE  GLOBAL DEFAULT   23 __data_start
    94: 0001080c     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start__
    95: 0000841c     0 FUNC    GLOBAL DEFAULT  UND ioctl@@GLIBC_2.4
    96: 000086d4     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_end
    97: 00010808     0 OBJECT  GLOBAL HIDDEN    23 __dso_handle
    98: 00010810     0 NOTYPE  GLOBAL DEFAULT  ABS __end__
    99: 00008578   204 FUNC    GLOBAL DEFAULT   12 __libc_csu_init
   100: 00010810     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_end__
   101: 00008428     0 FUNC    GLOBAL DEFAULT  UND printf@@GLIBC_2.4
   102: 00008434     0 FUNC    GLOBAL DEFAULT  UND close@@GLIBC_2.4
   103: 0001080c     0 NOTYPE  GLOBAL DEFAULT  ABS __bss_start
   104: 00010810     0 NOTYPE  GLOBAL DEFAULT  ABS _bss_end__
   105: 00010810     0 NOTYPE  GLOBAL DEFAULT  ABS _end
   106: 0001080c     0 NOTYPE  GLOBAL DEFAULT  ABS _edata
   107: 0000869c     0 NOTYPE  GLOBAL DEFAULT  ABS __exidx_start
   108: 00000000     0 FUNC    GLOBAL DEFAULT  UND __aeabi_unwind_cpp_pr1@@G
   109: 000084ec   136 FUNC    GLOBAL DEFAULT   12 main
   110: 000083c0     0 FUNC    GLOBAL DEFAULT   10 _init

Histogram for bucket list length (total of 3 buckets):
 Length  Number     % of total  Coverage
      0  0          (  0.0%)
      1  0          (  0.0%)      0.0%
      2  1          ( 33.3%)     18.2%
      3  0          (  0.0%)     18.2%
      4  1          ( 33.3%)     54.5%
      5  1          ( 33.3%)    100.0%

Version symbols section '.gnu.version' contains 12 entries:
 Addr: 0000000000008320  Offset: 0x000320  Link: 4 (.dynsym)
  000:   0 (*local*)       2 (GLIBC_2.4)     2 (GLIBC_2.4)     2 (GLIBC_2.4)  
  004:   3 (GCC_3.5)       0 (*local*)       0 (*local*)       2 (GLIBC_2.4)  
  008:   2 (GLIBC_2.4)     2 (GLIBC_2.4)     2 (GLIBC_2.4)     3 (GCC_3.5)    

Version needs section '.gnu.version_r' contains 2 entries:
 Addr: 0x0000000000008338  Offset: 0x000338  Link: 5 (.dynstr)
  000000: Version: 1  File: libgcc_s.so.1  Cnt: 1
  0x0010:   Name: GCC_3.5  Flags: none  Version: 3
  0x0020: Version: 1  File: libc.so.6  Cnt: 1
  0x0030:   Name: GLIBC_2.4  Flags: none  Version: 2

Notes at offset 0x00000148 with length 0x00000020:
  Owner                 Data size    Description
  GNU                  0x00000010    NT_GNU_ABI_TAG (ABI version tag)
    OS: Linux, ABI: 2.6.16
Attribute Section: aeabi
File Attributes
  Tag_CPU_name: "5TE"
  Tag_CPU_arch: v5TE
  Tag_ARM_ISA_use: Yes
  Tag_THUMB_ISA_use: Thumb-1
  Tag_ABI_PCS_wchar_t: 4
  Tag_ABI_FP_denormal: Needed
  Tag_ABI_FP_exceptions: Needed
  Tag_ABI_FP_number_model: IEEE 754
  Tag_ABI_align_needed: 8-byte
  Tag_ABI_align_preserved: 8-byte, except leaf SP
  Tag_ABI_enum_size: int
View Code

 

至此设备节点的注册和调用

posted on 2020-03-08 18:30  深海里的星星nanzh  阅读(391)  评论(0编辑  收藏  举报