objdump反汇编示例
随便写一个字符设备驱动 irq.c
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/delay.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/cdev.h>
#include <linux/device.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_gpio.h>
#include <linux/semaphore.h>
#include <linux/timer.h>
#include <linux/of_irq.h>
#include <linux/irq.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <linux/fs.h>
int major,minor,devid;
struct class *class;
struct cdev cdev;
static ssize_t irq_read(struct file *f, char __user *u, size_t s, loff_t *l)
{
printk("irq read ---------------\n");
return 0;
}
static int irq_open(struct inode *p, struct file *f)
{
printk("irq open ---------------\n");
return 0;
}
static struct file_operations irq_fops = {
.owner = THIS_MODULE,
.open = irq_open,
.read = irq_read,
};
static int __init irq_init(void)
{
printk("irq init -----------------\n");
if (major) {
devid = MKDEV(major, 0);
register_chrdev_region(devid, 1,"romanIRQ");
}
else {
alloc_chrdev_region(&devid, 0,1,"romanIRQ");
major = MAJOR(devid);
minor = MINOR(devid);
}
/* 2、注册字符设备 */
cdev_init(&cdev, &irq_fops);
cdev_add(&cdev, devid, 1);
/* 3、创建类*/
class = class_create(THIS_MODULE, "romanIRQ");
if (IS_ERR(class)) {
return PTR_ERR(class);
}
/* 4、创建设备*/
struct device *device = device_create(class, NULL,devid, NULL,"romanIRQ");
if (IS_ERR(device)) {
return PTR_ERR(device);
}
return 0;
}
static void __exit irq_exit(void)
{
printk("irq exit -----------------\n");
cdev_del(&cdev);
unregister_chrdev_region(devid, 1);
device_destroy(class, devid);
class_destroy(class);
}
module_init(irq_init);
module_exit(irq_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("roman");
写个Makefile(或者自己编译都可)
obj-m = irq.o
PWD := $(shell pwd)
KDIR := /lib/modules/$(shell uname -r)/build
all:
make -C $(KDIR) M=$(PWD)
clean:
rm -rf *.o *.ko *.mod.c *.sysmvers *.c~ *~
make后 生成 irq.ko
或者
gcc -S -o main.s main.c (如果是用户态代码gcc编译)
编译成汇编代码
gcc -c -o main.o main.c
objdump -s -d main.o > main.o.txt
目标文件main.o的反汇编结果输出到文件main.o.txt
以ko为例, 执行 objdump -S irq.ko
结果
objdump
objdump反汇编常用参数
• objdump -d <file(s)>: 将代码段反汇编;
• objdump -S <file(s)>: 将代码段反汇编的同时,将反汇编代码与源代码交替显示,编译时需要使用-g参数,即需要调试信息;
• objdump -C <file(s)>: 将C++符号名逆向解析
• objdump -l <file(s)>: 反汇编代码中插入文件名和行号
• objdump -j section <file(s)>: 仅反汇编指定的section
objdump帮助信息
输出objdump帮助信息:
objdump --help或者 man objdump