[kernel] Module binfmt_aout absent du kernel 3.14.1 ?
[kernel] Module binfmt_aout absent du kernel 3.14.1 ?
Bonjour,
suite à l'upgrade vers le kernel 3.14.1 (i686), je m'aperçois que le module binfmt_aout qui permet de lancer les vieux executables au format a.out n'est plus présent. C'est embêtant, car j'ai besoin de ce module pour faire tourner quelques vieux softs dont je ne possède que les executables.
Y a-t-il une solution à part downgrader vers le kernel 3.13.7 ?
Merci.
suite à l'upgrade vers le kernel 3.14.1 (i686), je m'aperçois que le module binfmt_aout qui permet de lancer les vieux executables au format a.out n'est plus présent. C'est embêtant, car j'ai besoin de ce module pour faire tourner quelques vieux softs dont je ne possède que les executables.
Y a-t-il une solution à part downgrader vers le kernel 3.13.7 ?
Merci.
Dernière modification par SebRmv le dim. 20 avr. 2014, 19:38, modifié 1 fois.
- FoolEcho
- Maître du Kyudo
- Messages : 10709
- Inscription : dim. 15 août 2010, 11:48
- Localisation : Basse-Normandie
Re: Module binfmt_aout ?
«The following statement is not true. The previous statement is true.»
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
essaie de télécharger les sources d'un vieux kernel et regarde si tu peux récupérer les sources du module binfmt_aout.c afin de le compiler séparement avec les sources du kernel 3.14.1, ensuite tu charges le module avec "modprobe -a nom_module",
autre solution beaucoup plus facile à mettre en oeuvre : installer un linux très basique contenant un vieux kernel dans une machine virtuelle ( virtualbox ) afin de lancer tes vieux programmes, une image iso d'un vieux live cd archlinux peut aussi convenir, tu charges l'iso dans virtualbox, tu arriveras ensuite dans un shell basique où tu pourras executer tes vieux programmes,
dernière et peut-être la meilleure solution: trouver des équivalents modernes à tes vieux programmes, ce serait très étonnant que tu ne puisses pas y arriver,
penser aussi à jeter un coup d’œil dans le dépôt "AUR" d'archlinux, un nostalgique a peut-être eu le même problème et a peut-être crée un paquet "binfmt_aout"
autre solution beaucoup plus facile à mettre en oeuvre : installer un linux très basique contenant un vieux kernel dans une machine virtuelle ( virtualbox ) afin de lancer tes vieux programmes, une image iso d'un vieux live cd archlinux peut aussi convenir, tu charges l'iso dans virtualbox, tu arriveras ensuite dans un shell basique où tu pourras executer tes vieux programmes,
dernière et peut-être la meilleure solution: trouver des équivalents modernes à tes vieux programmes, ce serait très étonnant que tu ne puisses pas y arriver,
penser aussi à jeter un coup d’œil dans le dépôt "AUR" d'archlinux, un nostalgique a peut-être eu le même problème et a peut-être crée un paquet "binfmt_aout"
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
oublies ce que j'ai dit,
apparemment le support des fichiers out est toujours là dans le kernel 3.14.1, c'est juste que le support n'a pas été activé au moment de la compilation par les mainteneurs du paquet par archlinux,
il suffit de recompiler le paquet en activant ce support dans le fichier caché config ( voir le wiki pour savoir comment compiler un kernel personnalisé )
https://projects.archlinux.org/svntogit ... ages/linux
tu peux aussi créer un rapport de bug sur le site d'archlinux pour qu'ils réactivent cette option
edit: je viens de créer le rapport de bug
apparemment le support des fichiers out est toujours là dans le kernel 3.14.1, c'est juste que le support n'a pas été activé au moment de la compilation par les mainteneurs du paquet par archlinux,
il suffit de recompiler le paquet en activant ce support dans le fichier caché config ( voir le wiki pour savoir comment compiler un kernel personnalisé )
ici je vois un "# CONFIG_BINFMT_AOUT is not set", en faisant un "CONFIG_BINFMT_AOUT=y" ça devrait résoudre ton problème, à confirmer par les autres forumeurs,# Executable file formats / Emulations
#
CONFIG_BINFMT_ELF=y
CONFIG_ARCH_BINFMT_ELF_RANDOMIZE_PIE=y
# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
CONFIG_BINFMT_SCRIPT=y
CONFIG_HAVE_AOUT=y
# CONFIG_BINFMT_AOUT is not set
CONFIG_BINFMT_MISC=y
CONFIG_COREDUMP=y
CONFIG_HAVE_ATOMIC_IOMAP=y
CONFIG_NET=y
https://projects.archlinux.org/svntogit ... ages/linux
tu peux aussi créer un rapport de bug sur le site d'archlinux pour qu'ils réactivent cette option
edit: je viens de créer le rapport de bug
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
Merci beaucoup pour cette réponse très détaillée. J'espère que le rapport de bug permettra la réintégration de ce module dans le paquet.
- benjarobin
- Maître du Kyudo
- Messages : 17393
- Inscription : sam. 30 mai 2009, 15:48
- Localisation : Lyon
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
Comme ce n'est pas vraiment courant comme module je pense qu'il serait préférable de créer un paquet fournissant ce module. Sinon c'est toujours bien de donnere lien vers le rapport de bug (oui je suis feignant )
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
voici le lien du rapport de bug :
https://bugs.archlinux.org/task/39978?p ... &sort=desc
en effet ça peut être une bonne idée la création du paquet fournissant le module
https://bugs.archlinux.org/task/39978?p ... &sort=desc
en effet ça peut être une bonne idée la création du paquet fournissant le module
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
ils ont commencé à répondre au rapport de bug :
ils semblent pas très chauds de vouloir activer cette option, va falloir probablement que SebRmv compile lui même le noyau avec l'option activée
https://bugs.archlinux.org/task/39978?p ... &sort=descI don't see why anyone would need a.out binaries. We also disable options for compatibility with libc5 and similarly old stuff, so I don't see why we should keep something as antique as a.out around.
What's the use case here?
ils semblent pas très chauds de vouloir activer cette option, va falloir probablement que SebRmv compile lui même le noyau avec l'option activée
- benjarobin
- Maître du Kyudo
- Messages : 17393
- Inscription : sam. 30 mai 2009, 15:48
- Localisation : Lyon
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
@Elbarto Le kernel est modulaire, tu n'as pas besoin de le recompiler si tu veux ajouter quelque chose...
Il suffit de créer un paquet ne construisant que ce module kernel
Il suffit de créer un paquet ne construisant que ce module kernel
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
faut-il créer/modifier un makefile particulier pour que le module se crée tout seul ou bien ce dernier est déjà tout prêt dans les sources du noyau ?
- benjarobin
- Maître du Kyudo
- Messages : 17393
- Inscription : sam. 30 mai 2009, 15:48
- Localisation : Lyon
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
Il faut, je crains, tout faire...
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
je me souviens que j'avais compilé il y a très longtemps un module spécifique pour une vieille webcam, ça m'avait pas semblé compliqué mais je ne me souviens plus des détails,
j'ai téléchargé les sources du 3.14.1, je vais regarder si je peux créer un pkgbuild qui crée uniquement le module binfmt_aout et qui le copie dans le bon dossier, ce cas m'interesse car si j'y arrive ça me sera utile quand j'aurai aussi besoin d'un module que les mainteneurs d'archlinux ne voudront plus activer par défaut
j'ai téléchargé les sources du 3.14.1, je vais regarder si je peux créer un pkgbuild qui crée uniquement le module binfmt_aout et qui le copie dans le bon dossier, ce cas m'interesse car si j'y arrive ça me sera utile quand j'aurai aussi besoin d'un module que les mainteneurs d'archlinux ne voudront plus activer par défaut
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
après investigation j'ai réussi à trouver le moyen de compiler le module binfmt_aout, la doc utile est ici :
https://www.kernel.org/doc/Documentatio ... odules.txt
le module se compose que d'un simple fichier c, binfmt_aout.c, et il n'utilise pas d'entêtes à part ceux déjà présents sur le système ( les paquets linux-headers et linux-api-headers ),
il suffit alors de créer un Makefile générique ( qui peut resservir pour compiler d'autres modules, il suffit d'adapter le nom pour la variable obj-m ) :
on met le fichier binfmt_aout.c et ce Makefile dans un repertoire séparé et on lance à la main un "make", la compilation se passe alors sans problème,
mais la compilation ne fonctionne que sous architecture i686, sous x64 j'ai une erreur sur la fonction "aout_dump_thread" qu'il ne trouve pas ( elle est pourtant dans l'entête /usr/lib/modules/3.14.1-1-ARCH/build/arch/x86/include/asm/a.out-core.h ), je pense que sous architecture 64 bits la recherche des entêtes se fait au mauvais endroit, il faut peut-être l'aider via des options supplémentaires ? Ou bien le support a.out n'est tout simplement pas possible sous architecture 64 bits ?
c'est pas trop grave vu que le forumeur SebRmv est sous architecture i686
au final sous i686 ça me donne un fichier binfmt_aout.ko que j'arrive à insérer dans le kernel ( insmod binfmt_aout.ko ),
je pense qu'il y a encore d'autres étapes à faire comme la compression gz du module et vraiment tester sur un programme de type a.out pour voir si le module fonctionne vraiment,
puis à créer le pkgbuild pour automatiser la création du module, je posterai le contenu du fichier
https://www.kernel.org/doc/Documentatio ... odules.txt
le module se compose que d'un simple fichier c, binfmt_aout.c, et il n'utilise pas d'entêtes à part ceux déjà présents sur le système ( les paquets linux-headers et linux-api-headers ),
il suffit alors de créer un Makefile générique ( qui peut resservir pour compiler d'autres modules, il suffit d'adapter le nom pour la variable obj-m ) :
Code : Tout sélectionner
obj-m := binfmt_aout.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
mais la compilation ne fonctionne que sous architecture i686, sous x64 j'ai une erreur sur la fonction "aout_dump_thread" qu'il ne trouve pas ( elle est pourtant dans l'entête /usr/lib/modules/3.14.1-1-ARCH/build/arch/x86/include/asm/a.out-core.h ), je pense que sous architecture 64 bits la recherche des entêtes se fait au mauvais endroit, il faut peut-être l'aider via des options supplémentaires ? Ou bien le support a.out n'est tout simplement pas possible sous architecture 64 bits ?
c'est pas trop grave vu que le forumeur SebRmv est sous architecture i686
au final sous i686 ça me donne un fichier binfmt_aout.ko que j'arrive à insérer dans le kernel ( insmod binfmt_aout.ko ),
je pense qu'il y a encore d'autres étapes à faire comme la compression gz du module et vraiment tester sur un programme de type a.out pour voir si le module fonctionne vraiment,
puis à créer le pkgbuild pour automatiser la création du module, je posterai le contenu du fichier
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
une première version non optimisée du pkgbuild :
ça nécessite un nouveau Makefile :
ensuite mettre le fichier Makefile, le fichier binfmt_aout.c ( extrait des sources du kernel ) et le fichier PKGBUILD dans un même repertoire, puis lancer la commande :
si ça plante il faut vérifier les signatures sha1sums en lançant un "makepkg -g" et modifier le fichier PKGBUILD en conséquence ( section sha1sums ),
ça ne compile que sur architecture i686, ça place le fichier binfmt_aout.ko dans /lib/modules/3.14.1-1-ARCH/extra,
je bosse sur une seconde version plus aboutie qui ira télécharger directement les sources du kernel pour extraire le fichier binfmt_aout.c
Code : Tout sélectionner
# Maintainer: Elbarto
pkgname=binfmt_aout
pkgver=1.0.0
pkgrel=1
pkgdesc='binfm_aout kernel module, for running an a.out binary format'
arch=('i686')
makedepends=('linux-headers' 'linux-api-headers')
url="https://www.kernel.org"
license=("GPLv3")
options=('!strip')
source=("binfmt_aout.c"
"Makefile")
sha1sums=('05adb9809b5cd9e961f31351c4ffd6bed1cc55a6'
'ad2e1de38b0977c598b1b962a8f667132b761104')
build(){
cd "$srcdir"
make
}
package() {
cd "$srcdir"
mkdir -p "${pkgdir}"/lib/modules
make install INSTALL_MOD_PATH="${pkgdir}"
}
Code : Tout sélectionner
obj-m := binfmt_aout.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
install:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules_install
Code : Tout sélectionner
makepkg -c
ça ne compile que sur architecture i686, ça place le fichier binfmt_aout.ko dans /lib/modules/3.14.1-1-ARCH/extra,
je bosse sur une seconde version plus aboutie qui ira télécharger directement les sources du kernel pour extraire le fichier binfmt_aout.c
- benjarobin
- Maître du Kyudo
- Messages : 17393
- Inscription : sam. 30 mai 2009, 15:48
- Localisation : Lyon
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
Le lien direct vers la source, pas besoin de télécharger toutes les sources : https://raw.githubusercontent.com/torva ... fmt_aout.c
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
merci de l'info,
je me demande s'il ne faudrait pas faire aussi un "depmod" après l'installation, dans un fichier post-install,
on voit que dans les fichiers de ce paquet aur le gars a fait un depmod dans un fichier *.install :
https://aur.archlinux.org/packages/bbswitch-ck/
en attendant j'ai essayé de créer un fichier a.out de test, c'est pas évident car je n'ai pas trouvé le moyen de le faire avec gcc, l'option pour le faire n'existe pas, ou bien gcc n'a pas été compilé avec cette option,
j'ai alors utilisé nasm qui permet d'en générer un, un petit code source en assembleur de type "hello world" :
compilation pour générer un format a.out :
j'essaie alors de l'executer après avoir chargé le module binfmt_aout et surprise ça ne fonctionne pas
soit il faut charger d'autres modules complémentaires, soit mon fichier a.out n'est pas bon
il faudrait que SebRmv nous passe en exemple un de ses programmes en a.out pour le test
edit : en faisant un "ld -e _start -o hello hello.o " j'ai un fichier binaire hello mais il est de type elf32 et pas a.out
je me demande s'il ne faudrait pas faire aussi un "depmod" après l'installation, dans un fichier post-install,
on voit que dans les fichiers de ce paquet aur le gars a fait un depmod dans un fichier *.install :
https://aur.archlinux.org/packages/bbswitch-ck/
Code : Tout sélectionner
post_install() {
EXTRAMODULES='extramodules-3.13-ck'
depmod $(cat /usr/lib/modules/$EXTRAMODULES/version)
}
post_upgrade() {
post_install
}
post_remove() {
post_install
}
j'ai alors utilisé nasm qui permet d'en générer un, un petit code source en assembleur de type "hello world" :
Code : Tout sélectionner
section .text
global _start ;must be declared for linker (ld)
_start: ;tell linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
Code : Tout sélectionner
$ nasm -f aout hello.asm
$ objdump -a hello.o
hello.o: format de fichier a.out-i386-linux
Code : Tout sélectionner
$ ./hello.o
bash: ./hello.o: cannot execute binary file: Erreur de format pour exec()
il faudrait que SebRmv nous passe en exemple un de ses programmes en a.out pour le test
edit : en faisant un "ld -e _start -o hello hello.o " j'ai un fichier binaire hello mais il est de type elf32 et pas a.out
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
je progresse, avec :
je n'ai plus l'erreur "cannot execute binary file" quand le module binfmt_aout est chargé, juste la mention "processus arrêté", c'est déjà mieux
il faut maintenant que SebRmv se manifeste et commence à tester, il a tout ce qu'il faut pour créer lui même son paquet,
la dernière version du PKGBUILD, avec récuperation automatique de binfmt_aout.c, et compression en gz du fichier ko :
Code : Tout sélectionner
$ nasm -f aout hello.asm
$ ld --oformat=a.out-i386-linux -o hello hello.o
$ file hello
hello: Linux/i386 demand-paged executable (QMAGIC)
$ ./hello
Processus arrêté
il faut maintenant que SebRmv se manifeste et commence à tester, il a tout ce qu'il faut pour créer lui même son paquet,
la dernière version du PKGBUILD, avec récuperation automatique de binfmt_aout.c, et compression en gz du fichier ko :
Code : Tout sélectionner
# Maintainer: Elbarto
pkgname=binfmt_aout
pkgver=1.0.0
pkgrel=1
pkgdesc='binfm_aout kernel module, for running an a.out binary format'
arch=('i686')
makedepends=('linux-headers' 'linux-api-headers' 'gzip')
url="https://www.kernel.org"
license=("GPLv3")
options=('!strip')
source=("https://raw.githubusercontent.com/torvalds/linux/v3.14/fs/binfmt_aout.c"
"Makefile")
sha1sums=('05adb9809b5cd9e961f31351c4ffd6bed1cc55a6'
'ad2e1de38b0977c598b1b962a8f667132b761104')
build(){
cd "$srcdir"
make
}
package() {
cd "$srcdir"
mkdir -p "${pkgdir}"/lib/modules
make install INSTALL_MOD_PATH="${pkgdir}"
gzip "${pkgdir}/lib/modules/3.14.1-1-ARCH/extra/binfmt_aout.ko"
}
- FoolEcho
- Maître du Kyudo
- Messages : 10709
- Inscription : dim. 15 août 2010, 11:48
- Localisation : Basse-Normandie
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
Oui, en effet. Tu peux soit le faire directement, soit indiquer à l'utiliseur de le faire ou de redémarrer sa machine.Elbarto a écrit :je me demande s'il ne faudrait pas faire aussi un "depmod" après l'installation, dans un fichier post-install,
on voit que dans les fichiers de ce paquet aur le gars a fait un depmod dans un fichier *.install :
«The following statement is not true. The previous statement is true.»
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
Hello,
j'avais un peu abandonné le problème en n'upgradant pas mon kernel.
Je viens d'essayer la solution proposée et ça a l'air de marcher.
J'ai légèrement modifié le PKGBUILD au moment du gzip:
Pour installer le paquet, faut-il faire "yaourt -a paquet" puis "sudo depmod -a ?"
(c'est en gros ce que j'ai fait, puis j'ai chargé le module à la main avec sudo modprobe binfmt_aout)
Je suis un peu déçu qu'ils aient donc désactivé volontairement la compilation par défaut de ce module.
Le cas d'utilisation est l'utilisation de vieux binaires "closed source" qui n'ont pas d'équivalent aujourd'hui. (je fais du développement retro-gaming)
Merci encore pour le paquet, je vais essayer d'adapter le truc pour une architecture 64 bits...
Seb
PS: Elbarto, as-tu l'intention de mettre ton paquet sur AUR? Ca serait super chouette. Si non, est-ce que ça t'embête que je le mette?
j'avais un peu abandonné le problème en n'upgradant pas mon kernel.
Je viens d'essayer la solution proposée et ça a l'air de marcher.
J'ai légèrement modifié le PKGBUILD au moment du gzip:
Code : Tout sélectionner
gzip "${pkgdir}/lib/modules/`uname -r`/extra/binfmt_aout.ko"
(c'est en gros ce que j'ai fait, puis j'ai chargé le module à la main avec sudo modprobe binfmt_aout)
Je suis un peu déçu qu'ils aient donc désactivé volontairement la compilation par défaut de ce module.
Le cas d'utilisation est l'utilisation de vieux binaires "closed source" qui n'ont pas d'équivalent aujourd'hui. (je fais du développement retro-gaming)
Merci encore pour le paquet, je vais essayer d'adapter le truc pour une architecture 64 bits...
Seb
PS: Elbarto, as-tu l'intention de mettre ton paquet sur AUR? Ca serait super chouette. Si non, est-ce que ça t'embête que je le mette?
- FoolEcho
- Maître du Kyudo
- Messages : 10709
- Inscription : dim. 15 août 2010, 11:48
- Localisation : Basse-Normandie
Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?
En effet.SebRmv a écrit :Pour installer le paquet, faut-il faire "yaourt -a paquet" puis "sudo depmod -a ?"
(c'est en gros ce que j'ai fait, puis j'ai chargé le module à la main avec sudo modprobe binfmt_aout)
Pour le depmod, tu peux le faire faire dans le .install et indiquer à l'utilisateur de lancer le modprobe ou de redémarrer.
«The following statement is not true. The previous statement is true.»