https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
head -c 20 ${executable} | tail -c 2
получит Вас 2 байта для e_machine
. Затем вы можете продолжить обработку. Например, x86 может быть либо 32-разрядным, либо 64-разрядным, а x86-64 - 64-разрядным.
В качестве альтернативы, если вы специально искали разрядность контейнера ELF (в отличие от исполняемого кода), который подразумевает требования коды, вы могли бы попытаться смотреть на e_ident[EI_CLASS]
:
head -c 5 ${executable} | tail -c 1
. Если байт равен 0x01, это 32 бит. Если это 0x02, это 64 бит. Если это что-то еще, в настоящее время оно не определено.
Edit: Рекомендуется read Инг (хех каламбур) описывает разницу между -n
и -N
.
Так без использования head
и tail
, это было бы лучше: read -r -N 5 elf_header < ${executable} && echo -n "${elf_header:4:1}"
На данный момент, единственный символ, который вторит на стандартный вывод будет "\\x1"
для 32-битных и "\\x2"
для 64-разрядных. В более полной среде linux вы можете передать это через xxd
, чтобы увидеть шестнадцатеричный дамп. Вы можете проверить бит с этим 1-лайнер:
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 "???"; }
Это выглядит чище, чем решение для чтения, но я не могу полагаться на мой андроид оболочки, имеющие 'head' и' tail'. – kb0
Итак, я обновил ответ с этим ограничением – inetknght