如何保持Linux内核模块构建的asm输出

时间:2010-05-24 22:59:13

标签: linux makefile linux-kernel linux-device-driver embedded-linux

我正在研究2.6.x内核的Linux内核模块,我需要查看程序集输出,尽管它目前是作为临时文件完成的,删除了后续文字。我想将汇编输出与我的C源文件混合在一起,这样我就可以轻松追踪问题所在。这是针对ARMv6内核的,显然objdump不支持这种架构。我在下面包含了我的makefile。

ETREP=/xxSourceTreexx/
GNU_BIN=$(ETREP)/arm-none-linux-gnueabi/bin
CROSS_COMPILE := $(GNU_BIN)/arm-none-linux-gnueabi-
ARCH := arm
KDIR=$(ETREP)/linux-2.6.31/
MAKE= CROSS_COMPILE=$(CROSS_COMPILE) ARCH=$(ARCH) make
obj-m += xxfile1xx.o

all:
 $(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
 $(MAKE) -C $(KDIR) M=$(PWD) clean

4 个答案:

答案 0 :(得分:7)

Objdump确实支持该架构。您的可执行文件将被称为arm-none-linux-gnueabi-objdump

答案 1 :(得分:6)

假设gcc和gnu汇编程序的输出比objdump更可读。告诉汇编器使用gcc:

的标志来保留其中间代码
 -Wa,-alh=basename.s

要让basename成为您需要告诉make的实际源文件名:

 -Wa,-alh=$<.s

将在源目录周围留下大量的foo.c.s文件。这里的一个大问题是gcc的工作方式是在代码生成和汇编之间使用临时文件。我找不到让gcc保存其中间体的方法,但是汇编程序很乐意为你存储一个列表。

将该参数放入Makefile CFLAGS留给读者练习(因为我讨厌“制造”并且更讨厌“gnu info”。

答案 2 :(得分:2)

要获取我的Linux内核模块的汇编语言列表,我将汇编器开关添加到内核脚本/ Makefile.build。

#cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
cmd_cc_o_c = $(CC) $(c_flags) -c -Wa,-alh=$<.lst -o $(@D)/.tmp_$(@F) $<

答案 3 :(得分:0)

您可以尝试将标志“-save-temps”发送到gcc。 它在我的嵌入式项目中适用于我,我没有在内核构建上尝试过它。