L'appui de l'octet de commande sous Linux de l'espace utilisateur
Je suis en train d'écrire un programme sous Linux en C pour analyser les fichiers de base produites à partir d'un système embarqué. Les fichiers de base peut être en little endian (BRAS) ou big endian (MIPS), et le programme à analyser peut être en cours d'exécution sur un little endian hôte (x86) ou big endian (PowerPC).
Par examiner les en-têtes je sais pas si le noyau est LE ou. Je préfère mon programme pas besoin de savoir si la machine sur laquelle il s'exécute sur est little ou big endian, je voudrais utiliser une API pour gérer cela pour moi. Si il n'y a pas de meilleure option, je crois que je vais commencer à compter sur les #ifdef __BIG_ENDIAN__.
Dans le noyau Linux, nous avons cpu_to_le32 et al pour convertir à partir des octets de commande à little endian, etc. Dans l'espace utilisateur, il est htonl et al, qui convertir de natif en big endian, mais pas d'équivalent pour les natifs de little endian que je peux trouver.
Quelqu'un peut-il suggérer API pour l'utilisateur de l'espace?
Modifier: Juste pour être clair, je suis à la recherche d'une API qui sait déjà que mon CPU est en big ou little endian et des swaps de revoir en conséquence. Je ne veux pas avoir de la litière de mon code avec #ifdefs pour cela. Je ne suis pas tout simplement à la recherche pour les extraits de code pour le swap d'octets; merci pour ces, mais ce n'était pas le point.
Ce genre de système embarqué est-il? Ne pouvez-vous pas simplement utiliser quelques croix gdb pour regarder les fichiers de base?
Pourrais-je écrire mon propre API? Assurez-vous. Je veux juste éviter de #ifdef BIG_ENDIAN si il y a un plus propre, plus facile à gérer façon de le faire via une API existante qui sait déjà que mon CPU est en big ou little endian.
Comme pour ce genre de système embarqué est: son tout à fait normal et ennuyeux PowerPC. J'ai déjà un cross-compilé gdb. gdb est grande pour beaucoup de choses, mais pas tout. Par exemple, il est spectaculairement mauvais à la recherche de la totalité de la mémoire pour un motif particulier; vous écrire un gdb macro qui prend une éternité et un jour pour terminer la recherche d'un moyen de taille de fichier de base.
OriginalL'auteur DGentry | 2009-05-17
Vous devez vous connecter pour publier un commentaire.
Basé sur ce que vous êtes en train d'essayer de faire (lire ELF core dump des fichiers sans avoir à vous soucier de endian), je crois que l'aide libelf, disponible ici avec un bon tutoriel ici, serait un bon choix.
Cette bibliothèque fonctionne de manière transparente avec big et little-endian ELFE de fichiers et fonctionne très bien sous Linux, en dépit de son FreeBSD origines (l'habituel "./configurer" et de "faire" de la séquence est tout ce que vous aurez besoin de construire). Pour sourire, j'ai essayé la "lecture d'un programme d'en-tête de la table" exemple (avec des modifications mineures à obtenir de construire) sur un système x86 fichier de base ainsi que d'un MIPS big-endian fichier de base, il semble qu'il "fonctionne".
Le elf32_xlatetom() et elf32_xlatetof() fonctions pourrait être intéressant à cette fin, l'API est décrite par exemple dans le docs.sun.com/app/docs/doc/816-5172/6mbb7btp9?a=view
OriginalL'auteur Lance Richardson
#include <arpa/inet.h>
est agréable et portable, mais ne garantit{ntoh,hton}{s,l}
. Si vous avez besoin de les conversions de valeurs de 64 bits, ou endian retournement sur big-endian (oùntoh
ethton
ne rien faire), il ne sera pas assez.Sur Linux (glibc),
#include < - endian.h>
fournit les éléments suivants, définis comme approprié pour la machine actuelle.Sur *BSD,
#include <sys/endian.h>
fournit ces mêmes macros.OriginalL'auteur ephemient
Si vous avez accès à l'néon coprocesseur et la mémoire est contigus (par exemple une image de la vidéo), vous pouvez exécuter swap16 sur le cadre à l'aide de la q registres (128bytes) de cette façon; bien sûr, vous avez à regarder pour les problèmes d'alignement
OriginalL'auteur Jay Ram
Si vous traiter le fichier dans un tableau d'octets, alors vous contrôlez l'ordre dans lequel vous choisissez les octets, et au-boutiste " de votre CPU finit pas important.
C'est aussi très utile en termes de traiter avec des problèmes d'alignement. Votre core dump peut concievably ont pas d'allégeance références. Je sais que c'est très peu probable, mais il pourrait être en raison de la corruption. C'est un autre problème qui est évité par le traitement du fichier comme un tableau d'octets.
J'ai utilisé cette approche dans la mise en œuvre jhead.
OriginalL'auteur Matthias Wandel
Vous pouvez utiliser la norme de réseau bytswapping fonctions dans l'apa/inet.h:
Ordre des octets de réseau est big-endian. Donc, ces fonctions:
Espère que cette aide.
OriginalL'auteur
Regardez le noyau fourni par les en-têtes dans /usr/include/linux/byteorder/comme __cpu__be32() et __ _ _ be32__cpu()
Jetez également un coup d'oeil dans /usr/include/linux/types d'.h fichier dans lequel vous pouvez définir des types explicites big/little endian plaine des entiers, ce qui aide beaucoup car toute erreur sera détectée au moment de la compilation.
OriginalL'auteur winden
Pourquoi avez-vous besoin d'une API pour le faire? Simplement écrire votre propre fonction pour appeler
htonl()
(ou autre produit) ensuite, il vous suffit d'inverser les octets. Ce n'est pas dur.Quelque chose comme:
OriginalL'auteur paxdiablo
Donné que la commutation endian-ess est facile, j'ai toujours fini par utiliser un code personnalisé comme cela, tout en gardant une règle stricte sur ce que la représentation que j'utilise dans le code, et la manipulation endianity à la fin, points d'entrée et de sortie).
OriginalL'auteur orip
Vous pouvez simplement écrire votre propre (ils sont basés sur l'Apple routines):
Ensuite, vous pouvez définir des macros conditionnelles:
Si vous êtes heureux avec Intel code assembleur, vous pouvez même le faire:
OriginalL'auteur Jim Dovey