[kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Reconnaissance et configuration du matériel / kernel linux
Répondre
SebRmv
newbie
Messages : 4
Inscription : dim. 20 avr. 2014, 09:57

[kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par SebRmv »

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.
Dernière modification par SebRmv le dim. 20 avr. 2014, 19:38, modifié 1 fois.
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10707
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: Module binfmt_aout ?

Message par FoolEcho »

Salut,

Merci de rectifier le titre. http://wiki.archlinux.fr/Forum#Format_du_titre :chinois:
«The following statement is not true. The previous statement is true.» :nage:
Elbarto
Elfe
Messages : 671
Inscription : jeu. 22 déc. 2011, 23:15

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par Elbarto »

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"
Elbarto
Elfe
Messages : 671
Inscription : jeu. 22 déc. 2011, 23:15

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par Elbarto »

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é )
# 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
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,

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
SebRmv
newbie
Messages : 4
Inscription : dim. 20 avr. 2014, 09:57

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par SebRmv »

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.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17235
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par benjarobin »

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
Elbarto
Elfe
Messages : 671
Inscription : jeu. 22 déc. 2011, 23:15

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par Elbarto »

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
Elbarto
Elfe
Messages : 671
Inscription : jeu. 22 déc. 2011, 23:15

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par Elbarto »

ils ont commencé à répondre au rapport de bug :
I 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?
https://bugs.archlinux.org/task/39978?p ... &sort=desc

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
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17235
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par benjarobin »

@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
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Elbarto
Elfe
Messages : 671
Inscription : jeu. 22 déc. 2011, 23:15

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par Elbarto »

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 ?
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17235
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par benjarobin »

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
Elbarto
Elfe
Messages : 671
Inscription : jeu. 22 déc. 2011, 23:15

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par Elbarto »

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
Elbarto
Elfe
Messages : 671
Inscription : jeu. 22 déc. 2011, 23:15

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par Elbarto »

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 ) :

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
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 :mrgreen:

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
Elbarto
Elfe
Messages : 671
Inscription : jeu. 22 déc. 2011, 23:15

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par Elbarto »

une première version non optimisée du pkgbuild :

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}"
}
ça nécessite un nouveau Makefile :

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 
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 :

Code : Tout sélectionner

makepkg -c
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
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17235
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par benjarobin »

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
Elbarto
Elfe
Messages : 671
Inscription : jeu. 22 déc. 2011, 23:15

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par Elbarto »

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/

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
}
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" :

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
compilation pour générer un format a.out :

Code : Tout sélectionner

$ nasm -f aout hello.asm 

$ objdump -a hello.o

hello.o:     format de fichier a.out-i386-linux
j'essaie alors de l'executer après avoir chargé le module binfmt_aout et surprise ça ne fonctionne pas :?

Code : Tout sélectionner

$ ./hello.o 
bash: ./hello.o: cannot execute binary file: Erreur de format pour exec()
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
Elbarto
Elfe
Messages : 671
Inscription : jeu. 22 déc. 2011, 23:15

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par Elbarto »

je progresse, avec :

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é
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 :mrgreen:

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"
}
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10707
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par FoolEcho »

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 :
Oui, en effet. Tu peux soit le faire directement, soit indiquer à l'utiliseur de le faire ou de redémarrer sa machine. :-)
«The following statement is not true. The previous statement is true.» :nage:
SebRmv
newbie
Messages : 4
Inscription : dim. 20 avr. 2014, 09:57

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par SebRmv »

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:

Code : Tout sélectionner

gzip "${pkgdir}/lib/modules/`uname -r`/extra/binfmt_aout.ko"
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?
Avatar de l’utilisateur
FoolEcho
Maître du Kyudo
Messages : 10707
Inscription : dim. 15 août 2010, 11:48
Localisation : Basse-Normandie

Re: [kernel] Module binfmt_aout absent du kernel 3.14.1 ?

Message par FoolEcho »

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)
En effet.
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.» :nage:
Répondre