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

JohnStorm Messages postés 7 Date d'inscription jeudi 9 mai 2024 Statut Membre Dernière intervention 16 mai 2024 - Modifié le 14 mai 2024 à 12:31
mamiemando Messages postés 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 - 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 .

8 réponses

[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 13 mai 2024 à 13:10

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 23359 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 29 novembre 2024 Ambassadeur 1 556
9 mai 2024 à 20:16

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 jeudi 9 mai 2024 Statut Membre Dernière intervention 16 mai 2024
Modifié le 9 mai 2024 à 21:00

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
10 mai 2024 à 17:35

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 jeudi 9 mai 2024 Statut Membre Dernière intervention 16 mai 2024
Modifié le 10 mai 2024 à 20:06

Mmmh j'ai un autre probleme je suis passer 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 jeudi 9 mai 2024 Statut Membre Dernière intervention 16 mai 2024
Modifié le 13 mai 2024 à 19:08

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_SUPPORTED_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 = register_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)
{
	
	unregister_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 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 7 804
14 mai 2024 à 12:40

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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 14 mai 2024 à 18:42

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 jeudi 9 mai 2024 Statut Membre Dernière intervention 16 mai 2024
Modifié le 15 mai 2024 à 14:18

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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
Modifié le 15 mai 2024 à 14:19

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 jeudi 9 mai 2024 Statut Membre Dernière intervention 16 mai 2024 > [Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024
Modifié le 15 mai 2024 à 14:19

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 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092 > JohnStorm Messages postés 7 Date d'inscription jeudi 9 mai 2024 Statut Membre Dernière intervention 16 mai 2024
15 mai 2024 à 10:44

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 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 7 804 > [Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024
15 mai 2024 à 14:22

@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 jeudi 9 mai 2024 Statut Membre Dernière intervention 16 mai 2024
Modifié le 21 mai 2024 à 11:57

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

0
mamiemando Messages postés 33401 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 28 novembre 2024 7 804
21 mai 2024 à 11:59

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