所有的工具:

aarch64-poky-linux-addr2line
aarch64-poky-linux-c++filt
aarch64-poky-linux-g++
aarch64-poky-linux-gcc-nm
aarch64-poky-linux-gprof
aarch64-poky-linux-nm
aarch64-poky-linux-readelf
aarch64-poky-linux-ar
aarch64-poky-linux-cpp
aarch64-poky-linux-gcc
aarch64-poky-linux-gcc-ranlib
aarch64-poky-linux-ld
aarch64-poky-linux-objcopy
aarch64-poky-linux-size
aarch64-poky-linux-as
aarch64-poky-linux-dwp
aarch64-poky-linux-gcc-5.2.1
aarch64-poky-linux-gcov
aarch64-poky-linux-ld.bfd
aarch64-poky-linux-objdump
aarch64-poky-linux-strings
aarch64-poky-linux-c++
aarch64-poky-linux-elfedit
aarch64-poky-linux-gcc-ar
aarch64-poky-linux-gcov-tool
aarch64-poky-linux-ld.gold
aarch64-poky-linux-ranlib
aarch64-poky-linux-strip

但是编译成模块的符号并不在vmlinux中,因此下面这样使用没有效果

查找某个内核符号的位置:
$ aarch64-poky-linux-nm vmlinux | grep vmalloc_user
ffff00000819f030 T vmalloc_user

这个内核符号(地址)对应源文件的哪一行
$ aarch64-poky-linux-addr2line -e vmlinux ffff00000819f030
/media/ubuntu/work/Yocto34/source/linux/mm/vmalloc.c:1870

例子:

usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
usbcore-y += devio.o notify.o generic.o quirks.o devices.o
usbcore-y += port.o
usbcore-y += of.o obj-m += usbcore.o KDIR := /media/ubuntu/work/Yocto3_4/build/tmp/work/g6m-poky-linux/linux-renesas/4.14.-r1/build/ all:
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=aarch64-poky-linux- ARCH=arm64
rm -f *.o *.order *.mod.c *.symvers *~ clean:
rm -f *.o *.order *.mod.c *.symvers *~ *.ko

补充:

clean:
make -C $(KERN_DIR) M=`pwd` modules clean #可实现自动删除
rm -rf modules.order

将这个驱动编译成模块:

SRC := ehci-hcd
obj-m := $(SRC).o
KDIR := /media/ubuntu/work/Yocto3_4/build/tmp/work/g6m-poky-linux/linux-renesas/4.14.35-r1/build all:
#make -C $(KDIR) M=$(PWD) modules ARCH=arm64(使用时这个删除并且下面给tab键)
make -C $(KDIR) M=$(PWD) modules CROSS_COMPILE=aarch64-poky-linux- ARCH=arm64 clean:
rm -f *.o *.order *.mod.c *.symvers *~ *.ko

参考:Documentation/kbuild/modules.txt里面介绍了如何编译成模块。

对模块进行反汇编:

aarch64-poky-linux-objdump -D -S ehci-hcd.ko > ehci-hcd.dump

由于ehci_hcd.c编译成模块了,但是偏移还是可以正常使用的

[ 5360.731638] PC is at qh_completions+0x410/0x4e0 [ehci_hcd]
[ 5360.737134] LR is at end_unlink_async+0x18c/0x2b0 [ehci_hcd]
[ 5360.927298] [<ffff000000b913c0>] qh_completions+0x410/0x4e0 [ehci_hcd]
[ 5360.933839] [<ffff000000b92994>] end_unlink_async+0x18c/0x2b0 [ehci_hcd]
[ 5360.940553] [<ffff000000b92afc>] end_iaa_cycle+0x44/0x50 [ehci_hcd]

使用将模块进行反汇编后的代码:
0000000000002fb0 <qh_completions>:
* Process and free completed qtds for a qh, returning URBs to drivers.
* Chases up to qh->hw_current. Returns nonzero if the caller should
* unlink qh.
*/
static unsigned qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
{
2fb0: a9b87bfd stp x29, x30, [sp, #-128]!
2fb4: 910003fd mov x29, sp
2fb8: a90153f3 stp x19, x20, [sp, #16]
2fbc: aa0003f4 mov x20, x0
2fc0: a9025bf5 stp x21, x22, [sp, #32]
2fc4: 91006035 add x21, x1, #0x18
2fc8: a90573fb stp x27, x28, [sp, #80]
....

内核中每一个存在的符号都如0000000000002fb0 <qh_completions>:对于显示指定的inline函数和编译器优化的inline函数,其样子如下,是没有符号地址的。
static inline void ehci_qtd_free (struct ehci_hcd *ehci, struct ehci_qtd *qtd)
{
dma_pool_free (ehci->qtd_pool, qtd, qtd->qtd_dma);
31a4: f9414280 ldr x0, [x20, #640]
31a8: aa1a03e1 mov x1, x26
31ac: f9401f42 ldr x2, [x26, #56]
31b0: 94000000 bl 0 <dma_pool_free>
...

对于qh_completions+0x410,只需要使用0000000000002fb0+0x410即可找出出问题的地址

Oops 信息包含以下几部分内容。
1.一段文本描述信息。
eg: “Unable to handle kernel NULL pointer dereference at virtual address 00000000” 的信息,它说明了发生的是哪类错误。
2.Oops 信息的序号。
eg: Internal error: Oops: 805 [#1] 比如是第 1 次、第 2 次等。这些信息与下面类似,中括号内的数据表示序号。
3.内核中加载的模块名称,也可能没有,以下面字样开头。
Modules linked in:
4.发生错误的 CPU 的序号,对于单处理器的系统,序号为 0,比如:
CPU: 0 Not tainted (2.6.22.6 #36)
5.发生错误时 CPU 的各个寄存器值。
6.当前进程名及进程PID
eg:Process swapper (pid: 1, stack limit = 0xc0480258) 这并不是说发生错误的是这个进程,而是表示发生错误时,当前进程是它。
错误可能发生在内核代码、驱动程序,也可能就是这个进程的错误。
7.栈信息。
8.栈回溯信息,可以从中看出函数调用关系,形式如下:
Backtrace:
[<c001a6f4>] (s3c2410fb_probe+0x0/0x560) from [<c01bf4e8>] (platform_drv_
probe+0x20/0x24)
...
9.出错指令附近的指令的机器码
eg:Code: e24cb004 e24dd010 e59f34e0 e3a07000 (e5873000) (出错指令在小括号里)

要让内核出错时能够打印栈回溯信息,编译内核时要增加“-fno-omit-frame-pointer”选
项,这可以通过配置 CONFIG_FRAME_POINTER 来实现。查看内核目录下的配置文件.config,
确保 CONFIG_FRAME_POINTER 已经被定义

补充:

1.要构建外部模块,您必须具有可用的预构建内核,其中包含构建中使用的配置和头文件。

2.编译模块时生成的其它文件:
modules.order: 编译出的模块的存放路径
Module.symvers: 编译的模块通过EXPORT_SYMBOL/EXPORT_SYMBOL_GPL导出的符号,其存储语法:
<CRC> <Symbol> <module>

3.与体系结构相关的头文件存放在arch/$(ARCH)/include/下,无关的在Linux

4.编译模块时额外指定头文件搜索路径的方法
obj-m := complex.o
ccflags-y := -I$(PWD)/include //指定额外头文件搜索路径

5.Makefile指定编译子目录 obj-y := foo/ bar/

6.modules.builtin(lib/modules下)文件列出了内核中内置的所有模块。modprobe使用它在尝试加载内置函数时不会失败。

7.编译内核:
# cp arch/arm/configs/xxxx .config
# make

8.导出内核头文件到用户空间
make headers_install ARCH=arm INSTALL_HDR_PATH=/xxx
/xxx默认是/user。
ARCH指定导出哪个体系放入头文件。make headers_install_all会导出所有体系的头文件。
要查看支持的体系结构的完整列表,请使用以下命令:ls -d include/asm-* | sed 's/.*-//

9.编译交叉平台的模块

obj-m += leds_4412.o

KDIR = /media/ubuntu/works/tiny4412/linux-3.0.

all:
make -C $(KDIR) M=$(PWD)
#rm -rf *.o *.o.cmd *.ko.cmd *.order *.symvers *.mod.c .tmp_versions clean:
rm -rf *.ko

10.编译主机平台的模块

obj-m += leds_4412.o

all:
make -C /lib/modules/`uname -r`/build M=$(PWD)
rm -rf *.o *.o.cmd *.ko.cmd *.order *.symvers *.mod.c .tmp_versions clean:
rm -rf *.ko

参考:Documentation/kbuild

Linux交叉编译工具链和模块编译的更多相关文章

  1. 64位的ubuntu14.04 LTS安装 Linux交叉编译工具链及32位“ia32-libs”依赖库

    ubuntu又迎来了其新一代的长期支持版本 14.04 LTS,其带来了许多令人期待的新特新,遂决定进行升级. 装好了64位版本及安装 Linux交叉编译工具链 运行GCC,${CROSS_COMPI ...

  2. 构建嵌入式Linux交叉编译工具链

    开源交叉编译工具链制作方法汇总: 1) 使用crosstool/crosstool-ng生成 2) 使用buildroot生成 ARM交叉编译工具链说明: 1) arm-linux-gcc是一个集合命 ...

  3. mac上编译 arm linux gnueabi交叉编译工具链toolchain

    crosstool-ng 编译和安装 交叉编译工具下载: git clone git@github.com:secularbird/crosstool-ng.git   切换到mac编译分支 git ...

  4. Linux ARM交叉编译工具链制作过程【转】

    本文转载自:http://www.cnblogs.com/Charles-Zhang-Blog/archive/2013/02/21/2920999.html 一.下载源文件 源代码文件及其版本与下载 ...

  5. 交叉编译工具链介绍《Building Embedded Linux Systems》

    1.前言 配置和编译一个合适的GNU工具链是相对复杂的并且需要很精细的操作,包括你需要对不同软件库之间的依赖关系.它们的各自的任务,不同软件库版本情况都有比较好的了解,编译工具链是一个乏味的工作. 2 ...

  6. Linux下获取arm的交叉编译工具链

    转载请注明文章:Linux下获取arm的交叉编译工具链 出处:多客博图 这里介绍,Linux下获取arm的交叉编译工具链,比如arm-linux-gnueabihf-gcc.arm-linux-gne ...

  7. Linux 安装交叉编译工具链

    交叉编译工具链下载地址: 链接:http://pan.baidu.com/s/1dE7P9rb 密码:300i 声明:下面每一步中的“pwd”指令都是为了看清楚当前的目录,没有其他实际意义. 系统:u ...

  8. CROSSTOOL-NG建立交叉编译工具链

    CROSSTOOL-NG建立交叉编译工具链 因为考试和学习的原因我已经一段时间没有玩我的JZ2440,现在终于考完试了,我再次找出了我的JZ2440.我之前学习的时候使用的是韦东山老师提供的开发工具, ...

  9. Crosstool-ng制作交叉编译工具链

    Crosstool-ng制作交叉编译工具链 交叉编译器可以用现成的,比如CodeSourcery制作的交叉编译器,也可以自己制作,一般是用kernel+gcc+glibc+binutils的源码包来编 ...

随机推荐

  1. VS2010/MFC编程入门之二十九(常用控件:列表视图控件List Control 下)

    上一节是关于列表视图控件List Control的上半部分,简单介绍了列表视图控件,其通知消息的处理和有关结构体的定义.本节继续讲解下半部分,包括列表视图控件的创建.CListCtrl类的主要成员函数 ...

  2. nginx重启 failed (98: Address already in use)

    启动nginx服务,无法正常启动,一查log日志,发现如题错误信息. 问题描述:地址已被使用.可能nginx服务卡死了,导致端口占用,出现此错误. 查看端口 netstat -ntpl 杀掉进程   ...

  3. PHImageManager 获取图片模糊

    PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init]; options.synchronous = true; o ...

  4. 面试官问:JS的this指向

    前言 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实.读者可以先拉到底部看总结,再谷歌(或各技术平台)搜索几篇类似文章,看笔者写的文章和别人有什么不同(欢迎在评论 ...

  5. ngular6开发不完全笔记(二)-- 管道

    自定义管道 管道(过滤器)为过滤数据显示下列list数据 pip.ts 文件 import { Pipe, PipeTransform } from '@angular/core'; import { ...

  6. Opencv3_Learning

    git地址 采用jupyter notebook进行编程,语言为python. 感谢博主--戳 这类东西真的是不是天天打,就是打过就忘.. 有志者事竟成,破釜沉舟,百二秦关终属楚. 苦心人天不负,卧薪 ...

  7. HDU 3572 Task Schedule(最大流判断满流)

    https://vjudge.net/problem/HDU-3572 题意: 有N个作业和M台机器,每个作业都有一个持续时间P,工作的日期为S~E.作业可以断断续续的在不同机器上做,每台机器每次只可 ...

  8. postgresql中终止正在执行的SQL语句

    在Linux系统中可以使用kill [pid]的方式强制删除进程,但对于修改数据表的语句来说,这样可能导致postgresql进入recovery mode,这样会导致锁表. Postgresql的运 ...

  9. 雷林鹏分享:JSP 开发环境搭建

    JSP 开发环境搭建 JSP开发环境是您用来开发.测试和运行JSP程序的地方. 本节将会带您搭建JSP开发环境,具体包括以下几个步骤. 配置Java开发工具(JDK) 这一步涉及Java SDK的下载 ...

  10. ORA-12505: TNS: 监听程序当前无法识别连接描述符中所给出的SID等错误解决方法

    程序连接orarle报ORA-12505错误 一.异常{ ORA-12505, TNS:listener does not currently know of SID given in connect ...