¿Cómo generar Module.symvers?

14

Recientemente pasé por Desempaquetar kernel-source rpm fuera del sistema (OpenSuse)? ; y como tardó más de 10 h en mi máquina, imagina mi sorpresa de que después de hacer el proceso descrito allí, ¡no encuentro ningún Module.symverslugar!

Cuando busco "generate Module.symvers", obtengo esto:

NOTA: "modules_prepare" no generará Module.symvers incluso si
se configura CONFIG_MODVERSIONS; por lo tanto, se debe
ejecutar una compilación completa del kernel para que las versiones del módulo funcionen.
( Documentación del kernel de Linux :: kbuild: modules.txt )

... pero realmente no lo entiendo: ¿no se compiló el núcleo en el paso anterior (descrito en el enlace anterior? Estoy seguro de que CC tardó más de 10 h en generar un montón de * .o archivos y LD para vincularlos, por lo que se debe haber construido algo, pero si es así, ¿dónde está entonces Module.symvers?

En términos más explícitos, ¿exactamente qué comando debo llamar para generar Module.symvers? Sé que make prepareeso no funcionará, pero ¿cuál es el comando que sí funcionará?

sdaau
fuente
Para su información, en openSUSE, puede obtener Module.symversmediante zypper install kernel-source, y similar sobre otra distribución de Linux. El archivo se encuentra en lib/modules/xxx/build.
Syrtis Major

Respuestas:

16

El Module.symvers(re) se genera cuando (re) compila módulos. Ejecute make modules, y debería obtener un Module.symversarchivo en la raíz del árbol del núcleo.

Tenga en cuenta que si solo ejecutó makey no make modules, aún no ha creado ningún módulo. Los símbolos del núcleo mismo ( vmlinuxo uno de los formatos de imagen dependientes de la arquitectura) están en System.map.

Gilles 'SO- deja de ser malvado'
fuente
Muchas gracias por eso, @Gilles. Desde entonces también encontré el archivo Answer: Module.symvers ; y puede confirmar que make modulesefectivamente crea Module.symvers. Gracias también por aclarar la diferencia entre makey make modules, y la relación con System.map. ¡Salud!
sdaau
¿Qué pasa si "make" no está disponible en la máquina?
bzupnick
3
@bzupnick Instalarlo. Es una de las herramientas necesarias para construir módulos de kernel de Linux. Una gran cantidad de software requiere hacer para construir.
Gilles 'SO- deja de ser malvado'
Estoy tratando de compilar de forma cruzada un LKM desde otra máquina. Instalar cosas en el primer cuadro no es posible.
bzupnick
@bzupnick Necesitas tener make para construir el módulo de todos modos. Todo está sucediendo en la máquina de compilación, no hay nada que hacer en la máquina de destino, excepto insmod.
Gilles 'SO- deja de ser malvado'
3

para las personas que encontraron esta pregunta buscando en Google la advertencia que se obtiene al compilar uno de los LKM de muestra de Derek Molloy: simplemente puede hacer uno vacío con touch Modules.symvers. Si su kernel no usa modversiones (CRC utilizados por el sistema operativo para ayudar a asegurar que los módulos coincidan con el kernel) y su módulo no tiene ninguna dependencia de otros módulos, esto será lo suficientemente bueno como para suprimir la advertencia.

WARNING: Symbol version dump ./Module.symvers
         is missing; modules will have no dependencies and modversions.

el archivo vacío es tan buena como la generada por gcc, que acaba de los símbolos de todos con el mismo 0x00000000valor de CRC, en un sistema sin MODVERSIONS.

jcomeau_ictx
fuente
1

En CentOS, y tal vez otras variantes de RedHat, simplemente extraiga el archivo correspondiente para su núcleo en ejecución:

zcat /boot/symvers-$(uname -r).gz > ./Module.symvers

En Ubuntu y tal vez otras variantes de Debian, el archivo parece ser encontrado automáticamente. Sin embargo, si lo necesita, el archivo está aquí:

/usr/src/linux-headers-$(uname -r)/Module.symvers
Id2ndR
fuente
No puedo encontrar la linux-headers-$(uname -r)carpeta
King Stone