2013-03-09 4 views
0

У меня есть базовый модуль драйвера Linux устройства:драйвера Linux модуль компиляция с помощью GCC

#include <linux/init.h> 
#include <linux/module.h> 
#include <linux/kernel.h> 

static int __init hello_init(void) 
{ 
printk(KERN_ALERT "Hello, world \n"); 
return 0; 
} 

static void __exit hello_exit(void) 
{ 
printk(KERN_ALERT "Goodbye, world \n"); 
} 

module_init(hello_init); 
module_exit(hello_exit); 

Я могу скомпилировать этот модуль в традиционном способе, который с помощью простого Makefile, который использует OBJ-м, но Я хочу скомпилировать это с помощью командной строки gcc. Это связано с тем, что я могу использовать флаг gcc -save-temps для просмотра промежуточных сгенерированных файлов (это может быть особенно полезно для понимания, поскольку ядро ​​Linux использует много препроцессоров).

Так есть способ скомпилировать с помощью командной строки gcc ??

EDIT Прикрепление Makefile я использовал

ifeq ($(KERNELRELEASE),) 
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build 
    PWD := $(shell pwd) 

EXTRA_CFLAGS+= -save-temps 

modules: 
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules 

modules_install: 
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install 

clean: 
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions 

.PHONY: modules modules_install clean 

else 

    obj-m := hello.o 
endif 
+0

Использование 'gcc' из командной строки успешно зависит от настройки оболочки окружающей среды должным образом. Это (частично), для чего предназначены 'make' и' Makefile'. Если вы действительно настаиваете на использовании оболочки, вам следует добавить свой «Makefile» на свой вопрос для просмотра. – sawdust

ответ

1

Не могли бы вы попробовать добавить "EXTRA_CFLAGS" в Makefile вашего модуля? , таких как EXTRA_CFLAGS + = -save-temps

Надеюсь, он вам поможет!

+0

Пробовал с вашим предложением Не работал :(он выполняется правильно в том смысле, что файл .o генерируется, но я не могу видеть промежуточные файлы (.i и т. Д.), И я пробовал некоторые варианты предложений, которые вы сказали, но не Удача :( –

+1

@LeoMessi - То, что вы пробовали? Использование переменной типа EXTRA_CFLAGS или просто CFLAGS - это проверенный и верный способ настройки правила компиляции в Make-файлах. Вы только что определили переменную и забыли вставить переменную в правило компиляции? (Ответ ** неполный ** в этом отношении.) – sawdust

+0

@sawdust: Я отредактировал сообщение, чтобы приложить Makefile, который я попробовал. Надеюсь, это поможет –

0

Я не знаю, как это сделать непосредственно в Makefile, но вы можете сгенерировать свой .i файл по файлу. В корневой директории исходного кода ядра Linux:

make drivers/media/pci/sta2x11/sta2x11_vip.i 

Это создаст файл й. Для создания исходного файла модуля (который находится вне дерева ядра) просто использовать абсолютный путь к нему:

make /path/to/hello.i 

Он должен работать

Смежные вопросы