https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
head -c 20 ${executable} | tail -c 2
finden Sie die 2 Bytes für e_machine
bekommen. Dann kannst du weiter damit arbeiten. ZB kann x86 entweder 32-Bit oder 64-Bit sein, während x86-64 64-Bit ist.
Alternativ, wenn Sie speziell sind für die Bitness des ELF Containers suchen (im Gegensatz zu dem ausführbaren Code im Gegensatz), die die Anforderungen des Codes bedeutet, können Sie bei e_ident[EI_CLASS]
versuchen suchen:
head -c 5 ${executable} | tail -c 1
. Wenn das Byte 0x01 ist, ist es 32 Bit. Wenn es 0x02 ist, ist es 64 Bit. Wenn es etwas anderes ist, ist es zu dieser Zeit undefiniert.
Edit: Empfohlen read ing (hehe pun intended) beschreibt den Unterschied zwischen -n
und -N
.
Also ohne den Einsatz von head
und tail
, dies wäre besser: read -r -N 5 elf_header < ${executable} && echo -n "${elf_header:4:1}"
An diesem Punkt das einzelne Zeichen, die auf der Standardausgabe Echo wurde wäre "\\x1"
für 32-Bit- und "\\x2"
für 64-Bit. In einer vollständigeren Linux-Umgebung können Sie das durch xxd
übergeben, um einen Hex-Dump zu sehen. Sie können mit diesem 1-liner das Bit überprüfen:
bitness32=$(printf "\\x1") && bitness64=$(printf "\\x2") && read -r -N 5 elf_header < ~/a.out && elf_bitness="${elf_header:4:1}" && { [[ "${bitness32}" == "${elf_bitness}" ]] && echo "32-bit"; } || { [[ "${bitness64}" == "${elf_bitness}" ]] && echo "64-bit"; } || { echo "???"; }
Das sieht sauberer als die Lese Lösung, aber ich kann nicht verlassen sich auf meine Android-Schale "Kopf" und "Schwanz". – kb0
Okay, ich habe die Antwort mit dieser Einschränkung aktualisiert – inetknght