Ich schreibe einen ELF-Analysator, aber ich habe Probleme, die Endiane korrekt zu konvertieren. Ich habe Funktionen, um die Endianess des Analysators und die Endianness der Objektdatei zu bestimmen.
Grundsätzlich gibt es vier mögliche Szenarien:
Gibt es eine Funktion, die ich verwenden kann, um die Bytereihenfolge / Änderungsendianness explizit zu vertauschen, da ntohs / l () und htons / l () die Endigkeit des Hosts berücksichtigen und manchmal nicht konvertieren? Oder muss ich meine eigene Swap-Byte-Ordnungsfunktion finden / schreiben?
Muss ich meine eigene Swap-Byte-Ordnungsfunktion finden / schreiben?
Ja, das tust du. Aber um es Ihnen leichter zu machen, verweise ich Sie auf diese Frage: Wie konvertiere ich zwischen Big-Endian- und Little-Endian-Werten in C ++? , die eine Liste von Compiler-spezifischen Byte-Order-Swap-Funktionen sowie einige Implementierungen von Byte-Order-Swap-Funktionen enthält .
Ich denke, es lohnt sich, The Byte Order Fallacy hier zu lesen, von Rob Pyke (einer von Gos Autor).
Wenn Sie Dinge richtig machen - dh Sie nehmen nicht etwas von der Byte-Reihenfolge Ihrer Plattformen an - dann wird es einfach funktionieren. Alles, was Sie beachten müssen, ist, ob sich Dateien im ELF-Format im Little Endian oder Big Endian -Modus befinden.
Aus dem Artikel:
%Vor%Nehmen wir an, Ihr Datenstrom hat eine kleine Endian-codierte 32-Bit-Ganzzahl. Hier ist, wie es zu extrahieren (angenommen, vorzeichenlose Bytes):
%Vor%Wenn es Big-Endian ist, hier ist, wie man es extrahiert:
Und lassen Sie den Compiler sich nur darum sorgen, das Ganze zu optimieren.
In Linux gibt es mehrere Konvertierungsfunktionen in endian.h
, die es erlauben zwischen beliebigen endianess zu konvertieren:
Bearbeitete, weniger zuverlässige Lösung. Sie können union verwenden, um auf die Bytes in beliebiger Reihenfolge zuzugreifen. Es ist sehr praktisch:
%Vor%Die ntoh-Funktionen können zwischen mehr als nur big und little endian wechseln. Einige Systeme sind auch 'Middle Endian', wo die Bytes nicht auf die eine oder andere Weise geordnet sind, sondern aufgemischt werden.
Wie auch immer, wenn alles, was Ihnen wichtig ist, groß und klein ist, dann müssen Sie nur wissen, ob sich die Endgültigkeit des Hosts und der Objektdatei unterscheiden. Sie haben Ihre eigene Funktion, die bedingungslos die Byte-Reihenfolge vertauscht, und Sie rufen sie auf oder nicht, abhängig davon, ob host_endianess()==objectfile_endianess()
.
Wenn ich über eine plattformübergreifende Lösung nachdenken würde, die unter Windows oder Linux funktioniert, würde ich etwas schreiben wie:
%Vor%Tags und Links c++ endianness