Os arquivos em /etc/init.d não devem ser executáveis compilados. Você coloca seu executável compilado em outro lugar, talvez /usr/local/bin ; então você escreve um script de inicialização em /etc/init.d , que sabe como iniciar e parar o programa compilado. Muitas vezes, isso é tão simples quanto executá-lo em segundo plano para iniciar e matar seu PID (ou seu nome executável usando killall ) para parar. init chamará o script de inicialização com um único argumento, a palavra start , stop , restart & c .; é responsabilidade do script saber como executar o serviço em si.
Para uma introdução rápida, experimente aqui . Pode haver um exemplo de script de esqueleto no diretório /etc/init.d que você pode alterar para se adequar ao seu caso.
Como uma nota lateral, que distro você está executando? Muitas distribuições modernas agora executam systemd em vez de sysvinit , que usa (por padrão) um arquivo de unidade declarativa em vez de um script de inicialização; Os arquivos da unidade IMO são mais fáceis de escrever. O systemd fornece um modo de compatibilidade sysvinit, portanto, é possível que você o rode. Nesse caso, recomendo escrever um arquivo de unidade em vez de um script.