du usa stat(2) para encontrar o número de blocos usados por um arquivo. Se você executar stat big , deverá ver que o número de blocos corresponde ao número dado por du .
Você pode forçar o du a contar os bytes usando a opção -b ; então a saída corresponde a ls 's.
Em ambos os casos, usa stat(2) (ou melhor, fstatat(2) , pelo menos na versão que tenho):
$ strace du big|&grep big
execve("/usr/bin/du", ["du", "big"], [/* 57 vars */]) = 0
newfstatat(AT_FDCWD, "big", {st_mode=S_IFREG|0644, st_size=2147483648, ...}, AT_SYMLINK_NOFOLLOW) = 0
write(1, "0\tbig\n", 60 big
A diferença no processamento é visível em du.c .