make в 2.6

Тема в разделе "WASM.UNIX", создана пользователем kamatoz, 4 дек 2006.

  1. kamatoz

    kamatoz New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2004
    Сообщения:
    31
    Адрес:
    Russia
    Помогите с make файлом для модуля ядра (ядро 2.6)
    в 2.4 make выглядел так
    ---------------------------------------
    all: aaa.o
    CC=gcc
    MODCFLAGS := -Wall -isystem /lib/modules/$(shell uname -r)/build/include -DMODULE -D__KERNEL__ -DLINUX
    bbb.o: bbb.c /lib/modules/$(shell uname -r)/build/include/linux/version.h
    $(CC) $(MODCFLAGS) -c bbb.c
    aaa.o: bbb.o ccc.o
    ld -r -o aaa.o bbb.o ccc.o
    clean:
    rm -f aaa.o bbb.o
    ----------------------------------------
    объектник ccc.o существует и сделан насмом, в 2.6 процесс мэйка поменялся и вроде как надо пользовать
    вроде того что ниже(возможно что то напутал), чтоб учитывались текущие настройки ядра, вот и не понятно как в модуль с линковать сторонний объектник, Памажите, заранее спасибо.
    -----------------------------------------------------------
    ifneq ($(KERNELRELEASE),)
    obj-y := aaa.o

    obj-m += aaa.o

    else
    KDIR := /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd)
    default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
    clean:
    rm -f bbb.o bbb.ko aaa.ko
    endif
    ----------------------------------------------
     
  2. int_0dh

    int_0dh New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    21
    Адрес:
    Russia
    в принципе тебе никто не мешает:
    1) взять какой-нибудь ccc.mod.c (в *.mod.c находится объявление и инициализация структуры module для этого модуля), подправить его под свои нужды, скомпилить ручками и линковать со своими *.o как обычно
    2) подлинковать его уже к готовому *.ko (получится, если функции инициализации модуля находятся не в нем(ccc.o) а если и в нем, то не вызываются напрямую как init_module()/cleanup_module()).
     
  3. kamatoz

    kamatoz New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2004
    Сообщения:
    31
    Адрес:
    Russia
    2 int_0dh
    2) пробывал в ручную прилинковать, линкуется, но когда делаю insmod говорит -1 Unknown symbol in module
    функция(та которая отдельно компилилась nasmом) косвенно вызывается из init_module

    вариант 1) по подробнее можешь раписать на примере?
     
  4. Bert

    Bert New Member

    Публикаций:
    0
    Регистрация:
    11 май 2005
    Сообщения:
    20
    Адрес:
    Russia
    У тебя есть 2 файла: aaa_base.c и ccc.o. Последний - это уже заранее скомпилирован nasm'ом ccc.asm Тогда

    1) mv ccc.o ccc.o_shipped
    2) Makefile должен быть вида

    ifneq ($(KERNELRELEASE,))
    obj-m := aaa.o
    aaa-y := aaa_base.o ccc.o
    else
    ... ну, далее, всё как у тебя.

    Получишь модуль aaa.ko

    Имхо, было бы проще сразу компилировать ccc.asm в процессе создания aaa.ko Для этого просто немного подправить Makefile надо.
    Документацию к kbuild смотри в Documentation/kbuild в исходниках ядра.
     
  5. int_0dh

    int_0dh New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    21
    Адрес:
    Russia
    после компиляции ядра обычно остается фигова туча файлов *.mod.c
    выглядят они как
    ......
    struct module __this_module
    __attribute__((section(".gnu.linkonce.this_module"))) = {
    .name = __stringify(KBUILD_MODNAME),
    .init = init_module,
    .exit = cleanup_module,
    }; тебе нужно отредактировать эту структурку (например поле name - так его будут звать в ядре и так он будет виден по cat /proc/modules)
    далее ты компилируешь его как обычно cc -Wall -O2 -D__KERNEL__ -DMODULE -I /usr/src/linux-<some.number.here>/include -c ccc.mod.c
    а далее ты компилишь также все остальное и линкуешь ld -r -melf_i386 ccc.mod.o ccc.o aaa.o bbb.o -o aaa.ko
     
  6. kamatoz

    kamatoz New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2004
    Сообщения:
    31
    Адрес:
    Russia
    2 Bert
    в документации к kbuild не написано как заменить ассемблер Gas на другой переменная AS=nasm некатит

    +
    obj-m := aaa.o
    aaa-y := aaa_base.o ccc.o

    нужно писать
    obj-m := aaa.o
    aaa-objs := aaa_base.o ccc.o
     
  7. kamatoz

    kamatoz New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2004
    Сообщения:
    31
    Адрес:
    Russia
    Рак мозга какой-то. Способностей моих явно не хватает.
    Чето я так с этим гемором и не справился, нарно быстрее будет под Gas переписать ассемблерный код.
    Всем спаисб.