Eu corri isso:
cat /usr/bin/* |
perl -ne 'map {$a{$_}++} split//; END{print map { "$a{$_}\t$_\n" } keys %a}' |
grep --text . | sort -n | plotpipe --log y {1}
e consegui isso:
(Mesmo com um log do eixo y, ainda parece exponencial! Há mais de 100x entre o topo e o fundo)
Olhando para os números:
:
31919597 ^H
32983719 ^B
33943030 ^O
39130281 \213
39893389 $
52237360 \211
53229196 ^A
76884442 \377
100776756 H
746405320 ^@
Não é de surpreender que ^@ (NUL) seja o byte mais comum em executáveis. \377 (255) e ^A (1) também fazem sentido intuitivamente para mim.
Mas o que faz com que 'H' (72) seja o segundo byte mais comum em executáveis - muito mais comum que 255 e 1?
(Se a pontuação desta resposta for 72, não vote positivamente!)
Esse seria o prefixo de tamanho de operando de 64 bits das instruções do código de máquina AMD64.
Você notará que isso só acontece em executáveis AMD64.
Se você comparar
/bin/*
em http://ftp.debian.org/debian/pool/main/c/coreutils/coreutils_9.1-1_arm64.deb , http://ftp.debian.org/debian/pool/main/ c/coreutils/coreutils_9.1-1_amd64.deb e http://ftp.debian.org/debian/pool/main/c/coreutils/coreutils_9.1-1_i386.deb , você verá:0x48 (72, 'H') está apenas entre os 3 primeiros no AMD64.
Em
ls
meu sistema Debian amd64:Se desmontarmos o código desse executável, encontraremos muitos bytes 0x48 nas instruções:
A maioria deles na primeira posição:
De acordo com http://ref.x86asm.net/geek.html#x48 , esse 0x48 é o prefixo do código de operação de tamanho de operando de 64 bits
REX.W
que especifica que a operação deve ser feita em operandos de 64 bits em vez de qualquer padrão que deveria ser.Todas as instruções são executadas em operandos de 64 bits.