Todos son correctos, solo muestran diferentes tamaños.
ls
muestra el tamaño del archivo (cuando lo abre y lo lee, esa es la cantidad de bytes que obtendrá)du
muestra el uso real del disco que puede ser más pequeño que el tamaño del archivo debido a los agujerossize
muestra el tamaño de la imagen de tiempo de ejecución de un objeto/ejecutable que no está directamente relacionado con el tamaño del archivo (BSS no usa bytes en el archivo sin importar cuán grande sea, el archivo puede contener información de depuración que no es parte de la imagen de tiempo de ejecución , etc)
Si desea saber cuánta RAM/ROM ocupará un ejecutable excluyendo la asignación de memoria dinámica, size
le brinda la información que necesita.