Module en c impossible a compiler , type of error :expected

JohnStorm Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33691 Date d'inscription   Statut Modérateur Dernière intervention   21 mai 2024 à 11:59

Bonjour j'essaie depuis deux jour de compiler un module en c malgres plusieurs modification j'ai toujours cette erreur qui m'empêche de compiler le module :

code du module :

#include <linux/fs.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/printk.h>
#include <linux/kernel.h>


static int __init module_start(void)
{
    printk(KERN_INFO "Hello, World!\n");
    return 0;
}
static void __exit module_end(void)
{
    printk(KERN_INFO "Goodbye, World!\n");
}

MODULE_INIT(module_start);
MODULE_LICENSE("GPL");
MODULE_EXIT(module_end);

après un essaie de compilation avec : gcc -c hello.c  -o hello.o

In file included from hello.c:2:
/usr/include/linux/init.h:151:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘init_rootfs’
  151 | void __init init_rootfs(void);
      |             ^~~~~~~~~~~
/usr/include/linux/init.h:381:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘parse_early_param’
  381 | void __init parse_early_param(void);
      |             ^~~~~~~~~~~~~~~~~
/usr/include/linux/init.h:382:13: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘parse_early_options’
  382 | void __init parse_early_options(char *cmdline);
      |             ^~~~~~~~~~~~~~~~~~~
hello.c:4:10: fatal error: linux/printk.h: Aucun fichier ou dossier de ce nom
    4 | #include <linux/printk.h>
      |          ^~~~~~~~~~~~~~~~
compilation terminated.

j'ignore que faire pour "patcher" linux/init.h et je vais me charger d'installer linux/printk.h plus tard  mon problem est sur init.h .

A voir également:

8 réponses

[Dal] Messages postés 6204 Date d'inscription   Statut Contributeur Dernière intervention   1 104
 

Bonjour JohnStorm,

Ce que tu essayes de compiler c'est un module pour le kernel Linux.

Tu ne montres pas ton Makefile et tu n'expliques pas quel code produit cette erreur, ni ce que tu as fait pour préparer ton environnement et espérer pouvoir compiler un module pour le noyau.

Si tu as ce type d'erreurs cela peut être dû au fait que ton environnement de compilation pour le module du kernel Linux n'est pas complet.

As-tu installé les headers du noyau correspondant au noyau installé sur ta distribution ?

1
yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention    

bonjour,

que ne comprends-tu pas dans ceci:

linux/printk.h: Aucun fichier ou dossier de ce nom
0
JohnStorm Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 

Tu n'as pas compris ce que je veux faire :

linux/init.h

comment resoudre l'erreur :

 error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘init_rootfs’

yg_be sache que je sais quoi faire pour cette erreur mais celle de  init.h

non .

0
PierrotLeFou
 

Sais-tu où se trouve le fichier init.h ? Utilises la commande  find -name pour le trouver.

Ensuite vas dans le fichier et cherches l'erreur.

0
JohnStorm Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 

Mmmh j'ai un autre probleme je suis er a autre chose ....

asm et asm-generic dans les linux-headers sont il pareil ??

erreur :

cc -c -I /lib/modules/6.5.0-28-generic/build/include lkm_example.c
In file included from /lib/modules/6.5.0-28-generic/build/include/linux/build_bug.h:5,
                 from /lib/modules/6.5.0-28-generic/build/include/linux/init.h:5,
                 from lkm_example.c:1:
/lib/modules/6.5.0-28-generic/build/include/linux/compiler.h:246:10: fatal error: asm/rwonce.h: Aucun fichier ou dossier de ce nom
  246 | #include <asm/rwonce.h>
      |          ^~~~~~~~~~~~~~
compilation terminated.
make: *** [Makefile:15 : hello.o] Erreur 1

es-ce que je peut remplacer le "dossier" asm du dossier include par asm-generic ??

0
JohnStorm Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 

Makefile :

obj-m = CharDevice5.o
KVERSION = $(shell uname -r)
all:
	make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
	make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

Fichier char device  *.c

#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/kernel.h>


MODULE_AUTHOR("skyrunner");
MODULE_DESCRIPTION("premier driver");
//MODULE_ED_DEVICE("Char device Pro");
MODULE_LICENSE("none");

unsigned int major = 254;

module_param(major, int, 0);
MODULE_PARM_DESC(major, "major number");

static ssize_t my_read_function(struct file *file, char *buf, size_t count, loff_t *ppos)
{
	printk(KERN_DEBUG "read()\n");
	return 0;
}
static ssize_t my_write_function(struct file *file, const char *buf, size_t count, loff_t *ppos)
{
	printk(KERN_DEBUG "write()\n");
	return 0;
}
static int my_open_function(struct inode *inode, struct file *file)
{
	printk(KERN_DEBUG "open()\n");
	return 0;
}
static int my_release_function(struct inode *inode, struct file *file)
{
	printk(KERN_DEBUG "close()\n");
	return 0;
}
static struct file_operations fops =
{
	read : my_read_function,
	write : my_write_function,
	open : my_open_function,
	release : my_release_function /* correspond a close */
};
static int __init mon_module_init(void)
{
	int ret;
	ret = _chrdev(major, "mydriver", &fops);
	if(ret < 0)
	{
		printk(KERN_WARNING "Probleme sur le major\n");
		return ret;
	}
	printk(KERN_DEBUG "mydriver chargé avec succès\n");
	return 0;
}
static void __exit mon_module_cleanup(void)
{
	
	un_chrdev(major, "mydriver");
	printk(KERN_DEBUG "mydriver déchargé avec succès\n");
}
module_init(mon_module_init);
module_exit(mon_module_cleanup);

La ca marche mais il me compile un fichier *.mod et un fichier *.ko , comment utiliser le fichier .mod ?? et a quoi il  sert ??

insmod: ERROR: could not insert module CharDevice5.ko: Device or resource busy

je ne comprend pas .....

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
mamiemando Messages postés 33691 Date d'inscription   Statut Modérateur Dernière intervention    

Bonjour,

Je te propose de repartir d'un squelette, par exemple celui-ci, que j'ai testé et qui compile bien un fichier .ko.

Assure-toi d'avoir au préalable installé les headers de ton noyau et make et le nécessaire pour compiler. Par exemple sous debian/ubuntu/... :

sudo apt install build-essential linux-headers-amd64

Bonne chance

0
[Dal] Messages postés 6204 Date d'inscription   Statut Contributeur Dernière intervention   1 104
 

Salut JohnStorm,

Tu as l'air d'avoir surmonté les problèmes de compilation, alors je suppose que tu as bien installé les headers du noyau correspondant au noyau installé sur ta distribution comme je te le demandais, bien que tu ne le dises pas.

Je pense que le fichier .mod est un fichier intermédiaire créé par le système de build (résultat de l'exécution de modpost sur le fichier objet) intégrant dans la liaison nécessaire à la création du fichier .ko les informations nécessaires à la résolution des symboles.

Si tu as une erreur "insmod: ERROR: could not insert module xyz.ko: Device or resource busy" c'est que, probablement, ton module est déjà chargé.

dmesg te dira l'historique de ce que tu as fait et ce qui est envoyé par le module via printk.

Tu devrais vraiment utiliser le Linux Kernel Module Programming Guide :

https://sysprog21.github.io/lkmpg/

C'est une ressource à jour et très didactique.

Il y a plusieurs exemples de code pour des char device, qui semble-être ce que tu veux faire, et qui sont aussi disponibles sur le dépôt Github associé à ce livre :

https://github.com/sysprog21/lkmpg/blob/master/examples/chardev.c

Cela dit, je te conseille de partir du début, en lisant et suivant les indications du livre du début, pour comprendre petit à petit les concepts propres au développement de modules pour le noyau, et ne tenter de compiler et utiliser chardev qu'une fois que tu as lu et pratiqué ce qui précède (chardev est dans les premières pages du livre, mais ne brûle pas les étapes).

0
JohnStorm Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 

Merci tous d'abord pour vos réponses.

J'ai une question quelqu'un aurait un lien pour la doc des  api linux (ubuntu) ?? un peut comme le  fichier win32.hlp pour windows XP (ne me trollez, pas je sais ça date) ....

Un genre de manuel RTFM .... pour le c

0
[Dal] Messages postés 6204 Date d'inscription   Statut Contributeur Dernière intervention   1 104
 

Tu parles d' "API Linux" de "manuel RTFM .... pour le C".

Si ce que tu cherches, c'est une documentation de référence pour les API du noyau Linux, c'est kernel.org qui est la référence.

Le noyau Linux étant développé en C, les interfaces exposées sont décrites en C (quoiqu'il y ait une partie Rust désormais).

Si c'est un manuel de C que tu cherches ou un autre type de document, clarifie ta demande s'il te plaît.

0
JohnStorm Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   > [Dal] Messages postés 6204 Date d'inscription   Statut Contributeur Dernière intervention  
 

C'est un manuel de C que je cherche, où toutes l'API est présentée (les syscall) ... et aussi pour le noyau Linux ...

0
[Dal] Messages postés 6204 Date d'inscription   Statut Contributeur Dernière intervention   1 104 > JohnStorm Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 

Le langage C est un langage standardisé, indépendant d'une implémentation particulière pour un système particulier. Je ne crois pas que l'on puisse trouver un manuel qui, à la fois, enseigne le C et présente la programmation de modules externes pour le noyau Linux, les API du noyau Linux et les appels systèmes exposés ou généralement la programmation pour le noyau Linux.

Comme ce type de programmation est non standardisée et correspond à des usages avancés du C, les documents qui les documentent ou qui enseignent leur usage considèrent comme acquis que le lecteur est familier du C.

Toute la documentation de référence afférente au noyau Linux est sur kernel.org

D'ailleurs, dans mes souvenirs, win32.hlp n'est pas un manuel de C, et si tu l'as utilisé dans le temps, tu as dû avoir des notions suffisantes de C.

0
mamiemando Messages postés 33691 Date d'inscription   Statut Modérateur Dernière intervention    

@JohnStorm StatutMembre 

Concernant le langage C en lui-même, est-ce que ce que tu cherches ce n'est pas tout simplement les pages de man (sections 2 et 3 pour le langage C) ?

man printf     # printf en shell
man 3 printf   # printf en C

Les pages de man sont également disponibles sur Internet. Ensuite pour des fonctions provenant d'une librairie, il faut regarder la documentation dédiée (généralement disponible en ligne).

Concernant le noyau Linux, [Dal] a déjà donné le lien : https://docs.kernel.org/core-api/kernel-api.html

Bonne chance

0
JohnStorm Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 

Merci à vous, je retourne coder dès demain. Je suis content de vos retours. Merci beaucoup à vous ....

0
mamiemando Messages postés 33691 Date d'inscription   Statut Modérateur Dernière intervention    

Bonjour @JohnStorm StatutMembre

Si tu as toutes tes réponses, pense à basculer le sujet en résolu. Sinon, merci de nous dire quels éléments te manquent pour clore le sujet.

0