Sono tutti corretti, mostrano solo dimensioni diverse.
ls
mostra la dimensione del file (quando lo apri e lo leggi, ecco quanti byte otterrai)du
mostra l'utilizzo effettivo del disco che può essere inferiore alla dimensione del file a causa di buchisize
mostra la dimensione dell'immagine di runtime di un oggetto/eseguibile che non è direttamente correlata alla dimensione del file (bss non usa byte nel file non importa quanto grande, il file può contenere informazioni di debug che non fanno parte dell'immagine di runtime , ecc.)
Se vuoi sapere quanta RAM/ROM occuperà un eseguibile escludendo l'allocazione dinamica della memoria, size
ti fornisce le informazioni di cui hai bisogno.