Todo programa pode ver a linha de comando completa que foi usada para executá-lo (exceto por curingas e variáveis, que o shell expande).
Em um programa C, a linha de comando é armazenada em argv , que é a abreviação de vetor de argumento .
O nome do programa é o primeiro elemento de argv , ou seja, argv[0] .
Claramente, no caso de halt e reboot , o programa está alterando seu comportamento com base em argv[0] .
Do bash, você pode ver a linha de comando completa usada para executar um programa usando ps -p <pid> -o cmd ou cat /proc/<pid>/cmdline .
Observe que há outro tipo de link chamado hard link que terá o mesmo efeito. No meu sistema, por exemplo, sudo e sudoedit são o mesmo arquivo com dois nomes diferentes e comportamentos diferentes.
ls -i pode ajudar você a encontrar esses comandos, por exemplo:
$ ls -il | awk '$3 != 1 { print }'
total 156872
2491111 -rwsr-xr-x 2 root root 127560 2011-01-20 05:03 sudo
2491111 -rwsr-xr-x 2 root root 127560 2011-01-20 05:03 sudoedit
Veja man ln para mais detalhes sobre hard links se você não estiver familiarizado com eles.