Как сохранить вывод 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. Он работает для меня в моем встроенном проекте, я не пробовал его на сборках ядра.