Qual é o uso de _start () em C?

Aprendi com meu colega que é possível escrever e executar um programa em C sem escrever uma function main() . Pode ser feito como abaixo

semMain.c

 // Compile it with gcc -nostartfiles void _start() { int ret = my_main(); exit(ret); } int my_main() { puts("This is a program without main!\n"); return 0; } 

Compile como: gcc -o withoutMain withoutMain.c –nostartfiles

Execute-o como: ./ withoutMain

Minha pergunta é: Quando alguém precisaria fazer esse tipo de coisa? Algum cenário do mundo real?

O símbolo _start é o ponto de input do seu programa. Ou seja, o endereço desse símbolo é o endereço para o início do programa. Normalmente, a function com o nome _start é fornecida por um arquivo chamado crt0.o que contém o código de boot para o ambiente de tempo de execução C. Ele configura algumas coisas, preenche o argumento array argv , conta quantos argumentos existem e, em seguida, chama main . Após os retornos main , a exit é chamada.

Se um programa não quiser usar o ambiente de tempo de execução C, ele precisará fornecer seu próprio código para _start . Por exemplo, a implementação de referência da linguagem de programação Go faz isso porque eles precisam de um modelo de encadeamento não padrão que requer alguma mágica com a pilha. Também é útil fornecer seu próprio _start quando você quer escrever programas ou programas realmente pequenos que fazem coisas não convencionais.

Enquanto main é o ponto de input para o seu programa de uma perspectiva de programadores, _start é o ponto de input usual da perspectiva do sistema operacional (a primeira instrução que é executada depois que o programa foi iniciado a partir do sistema operacional)

Em um típico programa C e, especialmente, em C ++, muito trabalho foi feito antes que a execução entre no main. Especialmente coisas como boot de variables ​​globais. Aqui você pode encontrar uma boa explicação de tudo o que está acontecendo entre _start() e main() e também depois que o main saiu novamente (veja o comentário abaixo).
O código necessário para isso é normalmente fornecido pelos escritores do compilador em um arquivo de boot, mas com a bandeira –nostartfiles você essencialmente diz ao compilador: “Não se preocupe em me dar o arquivo de boot padrão, me dê controle total sobre o que está acontecendo do começo”.

Às vezes isso é necessário e frequentemente usado em sistemas embarcados. Por exemplo, se você não tem um sistema operacional e você tem que habilitar manualmente certas partes do seu sistema de memory (por exemplo, caches) antes da boot de seus objects globais.