Willkommen im Forum.
session_start setzt einen (oder vielleicht auch mehrere) Header in der HTTP-Response, die von einem Server an einen Client geschickt wird. Die Header stehen in der Response per Definition vor dem eigentlichen – zum Beispiel – HTML-Code.
Da in den meisten Konfigurationen die Ausgabe von HTML-Code direkt als Response gesendet wird, müssen vor der ersten Ausgabe die Header geschickt werden und können nach dem Absenden dann logischerweise nicht mehr bearbeitet werden.
Es wäre allerdings möglich, die Ausgabe serverseitig zu buffern und erst am Ende des Scriptablaufs zu senden. In diesem Fall kann über die gesamte Laufzeit hinweg etwas an den Headern verändert werden.
Kann sein, dass das bei dir passiert. Kann auch sein, dass du lediglich ein zu niedriges error_reporting-Level eingestellt hast und den Fehler nicht siehst, den session_start erzeugt.