How to generate gcc debug symbol outside the build target?

How to generate gcc debug symbol outside the build target?

1. how to strip elf.

2. how to separate debug information from elf files.

3. how to use debug information in gdb(or ida pro).

ida pro : file -> load file -> DBG file

4. how to merge debug information into elf files.

How debuggers work: Part 3 – Debugging information

About debugging information.

How to find functions, variables and line number based on debugging information(dwarf)

process infomation get within kernel

linux get process name from pid within kernel

  unsigned int pid = task_pid_nr(current);

 unsigned char * comm= current->comm;

printk(KERN_INFO “Simon:pid=%u,comm=%s\n,pid,comm);

How to get current process’s UID and EUID in Linux Kernel 4.2?

http://stackoverflow.com/questions/39229639/how-to-get-current-processs-uid-and-euid-in-linux-kernel-4-2

unsigned int uid = current_uid();

unsigned int euid = current_euid();

 unsigned int suid = current_suid();

unsigned int gid = current_gid();

Get time within kernel :

unsigned int get_kernel_time_sec()

{

        struct timeval ctv;

        do_gettimeofday(&ctv);

        return (unsigned int)ctv.tv_usec;

}// And then you can create a rand function based on time. 

unsigned int rand(unsigned int limit)

{

        unsigned int c_tv = get_kernel_time_sec();

        if(limit==0)

        {

                return c_tv;

        }

        else

        {

                return c_tv%limit;

        }

}

#include <linux/cred.h> // current_uid & current_euid

#include <linux/time.h> // current_kernel_time

#include <linux/types.h> //timespec

#include <linux/timer.h>

#include <linux/sched.h> // task_pid_nr    current->comm;

Linux驱动开发错误:module license ‘unspecified’ taints kernel.

原文链接: http://blog.csdn.net/zengxianyang/article/details/50710695

前言

今天我要来说说在Linux驱动开发中Makefile编写规则的问题。其实这是驱动开发中的基础性的问题,怪自己基础不够扎实啊,犯了这样的低级错误。写这篇文章让自己巩固一下基础吧,唯有厚积,才能薄发!扎实的编程基础,是一个底层软件工程师应该具备的素质,这样才能年薪百万,迎娶白富美,走上人生巅峰!麻痹,老子又在意淫了,女朋友在哪里都还不知道,说多了都是泪,言归正传!别装逼了!讲正事!

1 Linux驱动Makefile编写规则介绍

1.1 Linux驱动Makefile实例讲解

这里,我们简单的举一个hello驱动的Makefile,来讲解驱动开发中,makefile的编写规则
[objc] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. obj-m := hello.o
  2. hello-obj := hello_main.o file1.o file2.o
  3. KERNELDR := /usr/src/linux-2.6.26
  4. PWD := $(shell pwd)
  5. modules:
  6.     $(MAKE) -C $(KERNELDR) M=$(PWD) modules
  7. moduels_install:
  8.     $(MAKE) -C $(KERNELDR) M=$(PWD) modules_install
  9. clean:
  10.     rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions
(1)obj-m := hello.o
表面驱动模块从目标文件hello.o建立,从目标文件建立后,模块的名字为hello.ko。
  (2) module-objs:如果模块由N个文件组成,那么其他文件就应该描述如下:module-objs:= file1.o file2.o,由于我们的模块叫做hello,在这个例子中应该写为hello-objs 。
(3)KERDIR  := /usr/src/linux-2.6.26
用来定位用于编译驱动的内核源码的目录位置。
(4)-C表示kernel source目录,在/lib/modules/<uname -r’>/build,在那里可以找到kernel的最高lenvel的makefile,M=表示在建立模块target的时候,makefile回归到我  们模块程序的目录。

2 驱动加载错误:module license ‘unspecified’ taints kernel

当时我的液晶驱动是由多个C文件组成的一个模块,但是由于多个C文件当中的一个xxx.o文件和模块目标文件xxx.o重名了,所以导致这个错误的,当时加载驱动的时候如下错误:
[objc] view plain copy

 在CODE上查看代码片派生到我的代码片

  1. root@Phoenix /root#insmod mxc_elcdif_fb.ko
  2. mxc_elcdif_fb: module license ‘unspecified’ taints kernel.
  3. Disabling lock debugging due to kernel taint
  4. mxc_elcdif_fb: Unknown symbol self_pid (err 0)
  5. mxc_elcdif_fb: Unknown symbol gpio_free (err 0)
  6. mxc_elcdif_fb: Unknown symbol drv_version (err 0)
  7. mxc_elcdif_fb: Unknown symbol reset_gpio (err 0)
  8. mxc_elcdif_fb: Unknown symbol disp_init_gpio (err 0)

2.1 解决办法

如果我们有多个c文件,可以在test-objs参数中加入他们的obj文件。接下来就是make了,编译后,生成hello.o文件和hello.ko,还有hello.mod.c及其obj文件,Module.markers Module.sysvers Modules.order 文件。

我们对多个*.c文件情况做一个说明:我们希望创建一个模块的名字叫做hello,我们有三个*.c文件,分别为hello.c, file1.c和file2.c。这样是有问题的,因为在Makefile中obj-m := hello.o,这是指定模块的名称, hello-objs := file1.o file2.o hello.o,这里是说hello模块包括的的obj文件,如果我们在里面不填写hello.o,那么实际并没有编译hello.c,而是在CC[M] file1.o和file2.o,通过LD[M]得到模块hello.o,如果我们在这里填写了hello.o,那么在obj-m和hello-objs中都含有hello.o,对make来讲会产生循环和混淆,因此也不能这样书写。如果我们由多个C文件来构造一个模块,那么C文件的名字不能和模块名字一样,在这个例子中我们可以将hello.c改名为hello_main.c,在Makefile中obj-m := hello.o,hello-objs = file1.o file2.o hello_main.o。