LINUX.ORG.RU

Подключение библиотек ".а" к модулю ядра


0

1

Есть исходники модуля ядра pf_ring.ko. Возникла необходимость пересобрать модуль с использованием своих ассемблерных функций, специализированных под 64-битную архитектуру. Скомпилированная as-ом функция теперь лежит в библиотеке libasm.a

В Makefile нету прямого вызова gcc, поэтому дописать параметром -lasm не имею возможности. Содержимое Makefile:

obj-m := pf_ring.o

SVNDEF := -DSVN_REV="\"$(shell svnversion -n .)\""

ifeq (,$(BUILD_KERNEL))
BUILD_KERNEL=$(shell uname -r)
endif

EXTRA_CFLAGS += -I$(PWD) $(SVNDEF)

HERE=$(PWD)

# set the install path
INSTDIR := $(DESTDIR)/lib/modules/$(BUILD_KERNEL)/kernel/net/pf_ring

all: Makefile pf_ring.c linux/pf_ring.h
    make -C /lib/modules/$(BUILD_KERNEL)/build SUBDIRS=$(HERE) EXTRA_CFLAGS='$(EXTRA_CFLAGS)' modules

clean:
...
install:
...
Собственно по адресу /lib/modules/2.6.35-22-server/build/Makefile лежит файл на 50килобайт, зацитирую только часть:
.....
ifdef CONFIG_MODULES

# By default, build modules as well

all: modules

#   Build modules
#
#   A module can be listed more than once in obj-m resulting in
#   duplicate lines in modules.order files.  Those are removed
#   using awk while concatenating to the final file.

PHONY += modules
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin
    $(Q)$(AWK) '!x[$$0]++' $(vmlinux-dirs:%=$(objtree)/%/modules.order) > $(objtree)/modules.order
    @$(kecho) '  Building modules, stage 2.';
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
    $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_modbuild
.....
Как подключить библиотеку при сборке модуля?

/usr/src/linux/Documentation/kbuild/makefiles.txt

читать до просветления

ananas ★★★★★ ()

o_O чем не угодили те функции, которые там использовались?

xydo ★★ ()

Можно запихнуть хоть в EXTRA_CFLAGS. Наверно это неправильно, но будет работать :)

true_admin ★★★★★ ()
Ответ на: комментарий от xydo

pf_ring обрабатывает не все виды сетевого трафика)

Cобственно сейчас решили компилить без библиотеки, просто дописывать S-файл при компиляции, типа:

all: Makefile pf_ring.c libasm.S linux/pf_ring.h
pf_ring собирается, асмовый код своё отрабатывает. Раньше тот же самый код был написан на Си, тесты показывали снижение производительности. Быстродействие асма ещё не тестировали, там будет видно стоит ли игра свеч.

SaintSatanist ()
Ответ на: комментарий от SaintSatanist

странно. вообще между 64 битами, написанными на Си и скомпилироваными с оптимизацией и отключенным CONFIG_DEBUG, и 64 битами, написанными на Asm-е, разницы особой быть не должно, если только в Asm-е не задействуются какие-либо расширения.

pf_ring.c - это оно? выглядит жутковато.

я дополнительные модули к ядру оформляю в виде отдельной директории в корневой директории исходников и кладу такой Makefile:

KDIR?=..
ARCH?=
CROSS_COMPILE?=
KOBJS=xxx1.o xxx2.o

xxx1-objs := xxx1main.o xxx1utils.o

obj-m := $(KOBJS)

all:
	make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) SUBDIRS=$(PWD) modules

clean mrproper:
	make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) SUBDIRS=$(PWD) $@

будут собраны модули xxx1.ko и xxx2.ko из файлов xxx1main.c и xxx1utils.c и xxx2.с

как в твоем случае должно получиться что-то типа этого:

KOBJS=pf_ring_mod.o

pf_ring_mod-objs := pf_ring.o libasm.o

obj-m := $(KOBJS)

xydo ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.