В примерах gnutls обнаружил небольшую ошибочку, при использовании функции:
void gnutls_transport_set_ptr (gnutls_session_t session, gnutls_transport_ptr_t ptr);
Второй параметр этой функции - на самом деле void *, и поэтому правильно ее вызывать не так
int sd = tcp_connect ();
gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) sd);
а так:
int sd = tcp_connect ();
gnutls_transport_set_ptr (session, (gnutls_transport_ptr_t) &sd);