Как сохранить вывод asm из сборки модуля ядра Linux

Я работаю над модулем ядра Linux для 2.6.X kernel и мне нужно просмотреть выходные данные сборки, хотя в настоящее время это делается как временный файл удаленных послесловий. Я хотел бы, чтобы выходные данные сборки были смешаны с моим исходным файлом 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 ответов


Objdump поддерживает эту архитектуру. Ваш исполняемый файл будет называться arm-none-linux-gnueabi-objdump


предполагая, что gcc и ассемблер gnu более читаемый вывод, чем objdump можно было. Скажите ассемблеру сохранить свой промежуточный код, используя флаги для gcc:

 -Wa,-alh=basename.s

и чтобы basename чтобы быть фактическим исходным именем файла, вам нужно сказать:

 -Wa,-alh=$<.s

который оставит груды foo.С. с файлов, лежащих вокруг вашего исходного каталога. Большая проблема здесь в том, что способ работы gcc использует временные файлы между генерацией кода и сборкой. Я не могу найти способ сделать gcc сохранить его промежуточные звенья, но ассемблер счастлив спрятать список для вас.

получение этого аргумента в CFLAGS Makefile оставлено как упражнение для читателя (потому что я ненавижу "make" и ненавижу "gnu info" еще больше.


чтобы получить список ассемблеров моих модулей ядра Linux, я добавил ассемблерные переключатели в Скрипты ядра / Makefile.строить.

#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) $<

вы можете попробовать флаг "- save-temps " в gcc. Он работает для меня в моем встроенном проекте, я не пробовал его на сборках ядра.