Hola,
El problema es que, una vez que "sirves" contenido, no puedes luego añadir más cabeceras HTTP. Es decir, volviendo a tu ejemplo:
Código PHP:
<html>
<head>
<title></title>
</head>
<body text="#000000">
<p><img src="bibliotecas.jpg" width="190" height="100" </p>
<p> </p>
<?php
session_start(); //me da el fallo que comenté
echo "<h2> por favor elija una categoria: </h2>";
A partir del "html" estás enviando el contenido, pero luego ejecutas "session_start()", que a su vez trata de enviar cabeceras HTTP, y de ahí el error: no es posible enviarlas, porque ya se han enviado, junto con el contenido del principio. La solución no es única, pero, en este caso podrías, en principio, hacer algo así:
Código PHP:
<?php session_start(); ?>
<html>
<head>
<title></title>
</head>
<body text="#000000">
<p><img src="bibliotecas.jpg" width="190" height="100" </p>
<p> </p>
<?php
echo "<h2> por favor elija una categoria: </h2>";
De este modo "session_start()" podrá hacer su trabajo, antes de que se envíe contenido alguno, como debe ser.
Es un problema muy habitual, sobre todo cuando se empieza con PHP. Poco a poco le pillarás el hilo, ya lo verás.