7

我正在为 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

5 回答 5

7

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

于 2010-05-24T23:09:46.000 回答
6

假设 gcc 和 gnu 汇编器的输出比现有的更具可读性objdump。使用 gcc 的标志告诉汇编器保留其中间代码:

 -Wa,-alh=basename.s

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

 -Wa,-alh=$<.s

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

将这个论点放入 Makefile CFLAGS 留给读者作为练习(因为我有点讨厌“make”,更讨厌“gnu info”。

于 2010-05-24T23:23:23.997 回答
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) $<
于 2011-11-04T21:14:36.260 回答
0

您可以尝试使用 gcc 的标志“-save-temps”。它在我的嵌入式项目中对我有用,我还没有在内核构建上尝试过。

于 2012-10-01T13:16:16.373 回答
0

正确的方法可能是在你的模块 makefile / Kbuild 文件中添加目标依赖项:

always-m += basename.s

(因为 kbuild 有合适的目标来生成 .s 文件)

如果你像我一样懒惰,这可能看起来像:

MOD_NAME := some_module_name
myunits := file1 file2 file3 ... and many more... without .c extension

obj-m   := $(MOD_NAME).o
$(MOD_NAME)-y := $(addsuffix .o,$(myunits))

# Comment/uncomment to generate assembly / preprocessor output
always-m += $(addsuffix .s,$(myunits)) $(MOD_NAME).mod.s
always-m += $(addsuffix .i,$(myunits)) $(MOD_NAME).mod.i

(这里有 2 个好处:生成的模块元注册文件的汇编和预处理器输出)

于 2021-11-30T14:35:49.843 回答