linux module kernel export symbol

linux - el símbolo del kernel marcado con "T" en/proc/kallsyms no se exporta



module symbol (2)

Marcar "T" en /proc/kallsyms significa que el símbolo es visible a nivel mundial y se puede usar en el código de otro kernel (por ejemplo, mediante controladores, compilado incorporado ).

Pero para ser utilizable en el código del módulo kernel , el símbolo es necesario para ser exportado usando EXPORT_SYMBOL o similar. La lista de símbolos exportados se mantiene por separado de la lista de todos los símbolos en el kernel.

Los símbolos exportados se pueden encontrar en el archivo /lib/modules/<kernel-version>/build/Module.symvers .

(este archivo debería existir para la posibilidad de compilar módulos kernel contra kernel dado).

El símbolo machine_power_off está marcado con "T" en / proc / kallsyms: $ grep -w machine_power_off /proc/kallsyms ffffffff8102391b T machine_power_off

Pero no se exporta . ¿Es necesaria una "T" en kallsyms para exportar un símbolo? ¿Se está exportando necesario y suficiente para usar en otros módulos?

Mi módulo que lo usa está compilado con una advertencia: WARNING: "machine_power_off" [/path/to/module.ko] undefined! En la máquina host (3.2.0-4-amd64) puedo cargar este módulo, pero en VirtualBox (3.16.0-4-amd64) produce el siguiente mensaje: insmod: ERROR: could not insert module module.ko: Unknown symbol in module

¿Por qué este módulo está cargado en mi sistema host, pero no en VirtualBox?


Para usar símbolos del kernel que son globales, pero no exportados (como el símbolo machine_power_off que mencionas), puedes usar kallsyms_lookup en tu código de módulo:

#include <linux/kallsyms.h> static void (*machine_power_off_p)(void); machine_power_off_p = (void*) kallsyms_lookup_name("machine_power_off");

Ahora puede llamar a la función machine_power_off través del puntero machine_power_off_p :

(*machine_power_off_p)();