|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Inactif
Inscription : mars 2006 Messages : 852 ![]() |
GCC est un compilateur imposant. Avoir un compilateur légé est chose aisée : on peut penser à nasm. Seulement, la création des fichier ELF passe toujours par LD. Le problème de LD c'est qu'il fait partie de l'environnement de développement standard qui lui-même dépend de libc6/glibc2... et libc6/glibc2 est une librairie trop lourde pour être utilisable sur les petits systèmes.
Mais il existe une solution qui vous permettra de créer des fichiers ELF sans même passer par un lieur. L'avantage de cette solution et qu'elle vous permet de créer des véritable fichiers ELF sous un environnement restreint, et vous permettra même, le fin-du-fin, de faire de la cross-compilation, c'est à dire de créer sous Windows des binaires ELF destinés à fonctionner sous Linux. Ceci, je l'espère, rendra service à tous/toutes ceux/celles qui travail sur des adaptation de Linux (petit PCs, système embarqué à peu de frais, etc). Vous pourrez conculter un exposé détaillé de la question ici : Création de fichier ELF pour Linux, sans utiliser de lieur. La solution passe par l'utilisation de deux pattern au choix. Vous utiliserez le premier pour les applications nécessitant un segement de code ainsi qu'un segment de données en lecture/écriture. Le second pattern sera à utiliser pour les applications ne nécessitant qu'un segement de code (notez que les donnée en lecture seule pourront être placées dans le segment de code). Sans plus tarder, allons droit au but, voici les deux patterns éditable : elf-with-data.asm Code :
elf-simple.asm Code :
|
||||
|
|
00
|
|
|
#2 |
|
Inactif
Inscription : mars 2006 Messages : 852 ![]() |
P.S. A l'occasion de mes expérimentations, j'ai découvert un bug dans la dernière version de nasm : dans certains cas nasm duplique le code binaire. Les détails de ce bug a été soumis sur sourceforge.net.
Ce bug n'empêche pas le fonctionnement du programme, mais duplique inutilement le binaire produit, la partie dupliquée étant concaténé à la partie légitimement présente. P.P.S J'ai remarqué même un bug du forum en voulant ajouté ce précédent PS au précédent message : j'ai eu un message me disant que mon message était trop court et que je devais ajouter au moins caractère. Et en retirant le PS du message, rendant le message plus court... ça passait Y at-il quelqu'un a qui je peux envoyer un screen-short démontrant ce bug du forum ? |
|
|
00
|
|
|
#3 |
|
Membre émérite
![]() ![]() Inscription : octobre 2004 Messages : 668 ![]() |
Par contre, ton url du premier post ne fonctionne pas (tu as dû te planter dans les balises
__________________
Software becomes slower faster than hardware becomes faster http://xrenault.developpez.com API C standard (C ANSI ) |
|
|
00
|
|
|
#4 |
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 990 ![]() |
En fait la technique c'est juste de recréer les en-têtes et tout ce qui fait parti du format ELF directement dans le fichier asm.
Je trouve ça très astucieux. Donc en extrapolant un peu, on peut créer des elf avec une structure aussi complexe qu'on veut (on pourra difficilement faire plus simple qu'un segment de code tout seul) pour peu qu'on ait de la doc sur le format elf. Je vais garder ces exemples dans un coin en attendant de pouvoir les étudier de plus près. Pour l'url qui marche pas : le lien est bien dans la balise url, mais l'url est absente de la balise.
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
|
|
00
|
|
|
#5 | ||||
|
Inactif
Inscription : mars 2006 Messages : 852 ![]() |
Citation:
Citation:
Je trouve que c'est une bonne chose : vouloir une chose simple, l'implémenté simplement, et seulement ensuite ajouter des fonctionalité si nécéssaire quand le besoin s'en fait strictement ressentire. Dans le domaine du logiciel, je ne crois pas en l'universalité (donc pour moi un logiciel ne doit pas avoir comme objectif de répondre à tous les besoin imaginables... et dans ces derniers cas, il doit être personalisé au cas pas cas, par un contrat d'assistance spécifique par exemple), ni en la portabilité (comme je dis toujours, Linux c'est Linux et Windows c'est Windows, et ainsi on profite du système au maximum sans gaspillage et sans dommage), mais seulement en la méthode et en la documentation (la seule chose portable à mes yeux, ce sont les concept, les idées, et les shema algorithmique). .... mais pourquoi je raconte tout ça encore Citation:
Alors justement là, il y a un point sur lequel je n'arrive pas à trouver de répons claire : est-ce que oui ou non les segment de code et de donnée sous Linux doivent être obligatoirement aligné sur 4096 bytes. Parce dans le pattern en assembleur que je donne, il sont alignés sur 4 bytes (32 bits). Ca fonctionne sous mes kernel de testes... mais j'ai copier mes petits programme de teste sur un serveur débian, et là j'ai segfault. J'ai recompiler en changeant l'alignement pour 4096, et là ça marche. Dans les code source de Linux, il existe une macro qui défini un flag qui s'appel PF_ALIGNWARN et qui s'applique au i486 seulement... je n'y comprends rien. Parce que apparement, ça ne semble pas être interdit... Bref, d'autres considérations me passe par l'esprit, mais je n'ai pas le temps d'en parler tout de suite. Note pour Celelibi : si tu t'interesse toujours au package Ada pour la console, en fait c'est en voulant créer des programme minimiliste utilisant la console, et ne dépendant pas de la glibc, que j'en suis arrivé à m'interesser à l'assembleur sous Linux (je ne le pratiquais qu'avant sous DOS). Et donc ce que je vais apprendre sur la console Linux par ce moyen, me raménera à ce fameux package que je n'abandonne pas contrairement au apparences (mais je suis occupé à d'autres choses que le developpement... alors je ne peux pas y passer tout mon temps) Citation:
|
||||
|
|
00
|
|
|
#6 |
|
Membre éclairé
![]() |
Beau boulot.
Les travaux de Brian Raiter (ELFkickers) devraient t' intéresser: il compresse le header pour réduire la taille du code (hello world en 59 octets). Le prog est moins portable (selon le noyau) mais c'est la démarche qui est intéressante. Avec ta méthode j'obtiens un "hello world" de 134 octets, par l' appel système 4. Pas mal! Par contre il faut un chmod+x. |
|
|
00
|
|
|
#7 |
|
Membre Expert
![]() Étudiant Inscription : octobre 2005 Messages : 1 202 ![]() |
genial, ça risque de me servir.
__________________
click my www ............|___ ...................\ .................._|_ ..................\ / ..................." |
|
|
00
|
|
|
#8 | |||||
|
Inactif
Inscription : mars 2006 Messages : 852 ![]() |
Citation:
Citation:
Quand on dit que ce n'est pas portable, il faut noter que la portabilité des applications basée sur la libc (the very bloated libc) est obtenu en créant une libc par platte forme (même s'il n'y a qu'un seul tronc de developpement). Et il serait tout à fait possible de créer une libsyscalls qui aurait autant d'implémentation qu'il y a de plateforme, et de créer des applications portable basées sur celle-ci. Mais ce serait déjà un début de bloat, parce qu'il faudrait aller unifier les structure de donnée au travers des plate forme par exemple. Et le bloat commence là ou on commence à mettre des intermédiaires et des wrappers là ou la logic de l'application ne le nécéssite pas strictement (c'est une manière pour le/la dévelopeur(se), de se décharger sur l'utilisateur final, phénomène extrément accentué par le free-ware, car il invite à une restriction drastique des coup de developpement, tant en temps qu'en argent). Mais il reste encore la solution de coder une librairie syscalls pour chaque plateforme, sans que cette librairie ne soit portable. Cela ne rendrait pas les applications basées sur cette librairie portable (bien sure), mais cela en faciliterait déjà le codage (it seem obvious :p ). En règle général il faut en finir avec le mythe de la portabilité, car de nos jours, on fait du « portable » sans même plus savoir pourquoi, mais seulement parce que c'est mis en avant comme un label ou parce que c'est à la mode. Mais qu'est-ce que la portabilité ? C'est un moyen de réduire les coups de développement pour un logiciel. Mais cette économie du coup de developpement se fait au détriment de la légéreté de l'application, et également de sa stabilité et de son efficacité. Quand on y regarde bien, cette stratégie est IRRESPONSABLE, car elle fait payer très chèr une petite économie. Car en effet, l'économie en un seul point de développé aboutit à un gaspillage sur des milliers, voir des millions de points d'utilisation. En clair, et avec un exemple imagé, un(e) developeur(se), peut vouloir économiser 3 ou 4 jours de developpement à plein temps, au prix d'une consomation de mémoire de 5 ou 10M de ram supplémentaire sur des milliers de post d'utilisation. Est-ce que vous comprennez la logique ? Donc exit la portabilité, et oui à l'exploitation au maximum de toute les caractéristique spécifique d'une plateforme d'exploitation. Et encore, j'oubli de dire qu'en plus du gaspillage, la portabilité empêche d'utiliser les petits plus locaux que l'on peut trouver sur telle ou telle plateforme. Donc il y a même un gachis dans les fonctionnalité. Et quand on veut tout les plus qui existe partout, on se retrouve avec des mamouth à la glibc. Franchement entre nous, la portabilité n'est-elle pas illogique ? Parce que soit on veut que tous soit partout pareil, et alors dans ce cas la solution la plus intelligente serait quand même plutôt alors le même matériel et le même OS partout. Et si on répond qu'on ne peut pas avoir le même matériel et le même OS partout, parce que le notion de « cette solution est meilleur que celle-ci » est dépendante d'un grand nombre de facteur, alors on démontre que les système ne peuvent pas tous se ressembler, et, et .... et on démontre par la même que la portabilité n'a aucun sens. Comme je dis toujours, c'est la portabilité de l'information qu'il faut privilégié, la portabilité des concepts, et la portabilité des algorithme, ce qui peut se faire naturellement, parce que ce sont des choses abstraite... reste à l'implémenté/adapté chaque à la sauce local, pour plus d'économie, plus d'éfficacité, une meilleure d'intégration à l'environnement, et plus de cohérence vis-à-vis du système et de l'environnement (ce qui mettrait fin à beaucoup de frustration). Bon, merci à tous, merci pour vos commentaires, parce que vous m'avez donner l'inspiration et je viens d'écrire un brouillon d'article pour mon site. Citation:
Et au fait Lunixinclar, est-ce que ce hello-world s'execute normalement sous ton Linux ? Parce que j'ai remarqué que l'alignement sur 4 octets ne fontionne pas partout... mais l'alignement sur 4096 bytes me semble être problématique, parce que d'après le doc ELF, l'alignement en mémoire doit aussi être l'alignement dans le fichier, et avec un alignement à 4096 bytes, il y a des padding énormes, et c'est un vrai gachis Citation:
Citation:
|
|||||
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() Étudiant Inscription : octobre 2005 Messages : 1 202 ![]() |
ça vas peut être (si un jour je démarre le projet) me permettre de faire des mise a jour de mon logiciel assez simplement.
je ne peux pas me permettre d'envoyer des .c (ou .cpp, ou autre) sur les serveurs (pour des raisons diverses ) et je n'ai pas forcement accès a un environnement de compilation non plus ...donc la solution c'est d'envoyer des binaires ... sauf que je bosse sur des machines avec des archs différentes (du sparc au x86_64 en passant par le PIC18 ...) alors cross compil obligatoire avec un PC sur lequel j'ai 50 versions de la libc (une par arch et sous-arch). c'est un peu lourd ... alors je me dis que je peux ptetre faire une mini libc (avec juste ce dont j'ai besoin) et un ld "ultra simplifié" par arch/sous-arch. m'enfin, tout ça reste de l'ordre du projet a faire dans longtemps, le jour ou j'aurais le temps. -- je precise : tout cela dans un environnement "non professionnel", je vois mal ce genre de bidouilles abomiffreuses dans l'industrie.
__________________
click my www ............|___ ...................\ .................._|_ ..................\ / ..................." |
|
|
00
|
|
|
#10 | |||
|
Membre émérite
![]() Inscription : janvier 2004 Messages : 990 ![]() |
Citation:
Citation:
N'est-ce pas en quelques sortes ce que l'on fait avec un code source portable et un compilateur ? Un code source portable est un code qui suit une norme/un standard qui à été défini indépendamment de toute architecture logiciel/matériel. Par exemple, un code source en Ada. Ensuite il suffit d'avoir un compilateur pour chaque architecture materiel et qui optimise pour l'architecture logiciel. Bien entendu tu pourrais me dire que ton package qui fait du contrôle de terminal est en Ada, mais ne produit pas le même effet sous win et nux. Ce à quoi je répondrais que ton code est dépendant de l'architecture logiciel (en l'occurrence du terminal utilisé). Mais je suis d'accord que même si il existe des langages normalisés, les compilateur n'optimisent pas toujours comme il le faudrait. Mais que diable, nous ne sommes plus aux temps des cartes perforées. Quant-aux lib monstres comme la glibc. Le couple fichier exécutable/glibc est similaire au couple code source/compilateur. Ici le fichier exécutable est censé être écrit dans un langage portable, et tout ce qui peut être optimisé par l'architecture locale est délaissé à la lib. Mais bien entendu comme c'est le fichier exécutable qui devra être exécuté (lapalissade Citation:
__________________
Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter. |
|||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com