c++ linux kernel-module compiler-errors

c++ - advertencias del enlazador del módulo kernel de Linux: "*** Advertencia:<función>[<módulo>] indefinido!"-¿alguna forma de deshacerse de ellos?



kernel-module compiler-errors (5)

No, ellos no son. Aunque construyas tu código en el árbol o fuera de él, este mensaje no debería mostrarse. Creo que debes arreglar tu archivo Makefile. Aquí hay un ejemplo de archivo MAKE. No es perfecto, pero solía funcionar (hasta 2.6.26, no lo intenté desde entonces):

ifneq ($(KERNELRELEASE),) # We were called by kbuild obj-m += mymodule.o mymodule-objs := mymodule_usb.o a.o b.o c.o else # We were called from command line KDIR := /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: @echo '' Building FOO drivers for 2.6 kernel.'' @echo '' PLEASE IGNORE THE "Overriding SUBDIRS" WARNING'' $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules install: ./do_install.sh *.ko endif # End kbuild check clean: rm -f -r *.o *.ko .*cmd .tmp* core *.i

Para obtener más documentación, puede verificar el árbol del kernel, el proceso de kbuild está documentado

Al compilar los módulos del kernel de Linux que dependen el uno del otro, el enlazador proporciona advertencias de símbolos indefinidos como

Building modules, stage 2. MODPOST *** Warning: "function_name1" [module_name] undefined! *** Warning: "function_name2" [module_name] undefined! *** Warning: "function_name3" [module_name] undefined!

Los símbolos no resueltos se resuelven tan pronto como el módulo se inserta en el kernel usando insmod o modprobe. Sin embargo, ¿hay alguna forma de deshacerse de la advertencia del enlazador?

He leído tres Google SERP''s sobre este tema, parece que nadie sabe la respuesta. ¿Se supone que estas advertencias de enlazador son así cuando construyes un módulo kernel?


Finalmente lo tengo. Gracias a shodanex por ponerme en el camino correcto.

Actualización: tenga mucho cuidado al aplicar esta corrección a versiones para versiones anteriores de kernel, ya que hay un error en el archivo Makefile.modpost en versiones anteriores del kernel que hace que su compilación se comporte mal y cree objetivos incorrectos cuando especifica la opción KBUILD_EXTMOD .

Debe especificar las rutas al origen de los módulos de los que depende en el parámetro de configuración KBUILD_EXTMOD .

Digamos que tienes un módulo foo que depende de los símbolos de la barra de módulos.

Los archivos fuente para foo están en foo / module / y los archivos fuente para bar están en barra / módulo /

El comando make en Makefile for foo probablemente se parece a

make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR / M=`pwd`/module / modules

(la línea exacta puede diferir en su proyecto).

Cambiarlo a

make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR / M=`pwd`/module / KBUILD_EXTMOD=`pwd`/../bar/module / modules

(Agregamos KBUILD_EXTMOD = pwd /.../bar/module / line, donde pwd /.../bar/module es una ruta de acceso a las fuentes del módulo kernel del que dependemos.

Uno esperaría que el parámetro KBUILD_EXTRA_SYMBOLS funcionara de esta manera, sin embargo, es KBUILD_EXTMOD .


Mi necesidad de ser adaptado a tu árbol. En nuestra fuente creamos un SYMBOLSDIR que es una ruta a todos los módulos

SYMBOLSDIR = ''alguna ruta''

make (igual que en el ejemplo anterior) $ (KERNELDIR) MODVERDIR = $ (SYMBOLSDIR) modules


Use KBUILD_EXTRA_SYMBOLS como se indica a continuación: KBUILD_EXTRA_SYMBOLS = ''su ruta de módulo'' / Module.symvers


Relacionado con la técnica anterior de usar KBUILD_EXTMOD, y la cuestión de en qué versiones del kernel funciona:

  • andycjw indicó que no funcionó para él en 2.6.12
  • No funcionó para mí en 2.6.15 (rompí la compilación de mi módulo)
  • Al revisar los compromisos del kernel, veo una serie de cambios en Makefile.modpost que parecen estar relacionados en 2.6.26 y 2.6.28, por lo que espero que uno de ellos sea el límite.