Implementação pilha com lista

boa noite estou tentando implementar pilha com lista para inserir letra e depois retirar e imprimir a medida que vai retirando mais nao está dando certo e não sei por que. Segue o código se alguém puder ajudar fico muito agradecida.

#include <stdio.h>
#include <stdlib.h>
struct nome//no
{
char letra; //float info;
struct nome *proximo;// no* prox;
}; typedef struct nome Nome;
struct pilha
{
 Nome *primeiro; //No* prim;
};typedef struct pilha Pilha;

Pilha* cria (void)
{
Pilha *p;
p = (Pilha*) malloc(sizeof(Pilha));
p->primeiro = NULL;
return p;
}
Nome* insere_inicio (Nome *l, char letranome)
{
Nome *p;
p = (Nome*) malloc(sizeof(Nome));
p->letra = letranome;   p->proximo = l;
return p;
}
Nome* retira_inicio (Nome *l)
{
Nome *p;
p = l->proximo;
free(l);
return p;
}
void push (Pilha *p, char letranome)
{
p->primeiro = insere_inicio(p->primeiro,letranome);
}
char pop (Pilha *p)
{
char v;
if (vazia(p))
{
printf("Pilha vazia.\n");
exit(1);
}
v = p->primeiro->letra;
p->primeiro = retira_inicio(p->primeiro);
return v;
}
int vazia (Pilha *p)
{
return (p->primeiro==NULL);
}
void libera (Pilha *p)
{
Nome* q;
q = p->primeiro;
while (q!=NULL)
{
Nome* t;
t = q->proximo;
free(q);
q = t;
}
free(p);
}
void imprime (Pilha *p)
{
Nome *q;
for (q=p->primeiro; q!=NULL; q=q->proximo)
{
printf("%c\n",q->letra);
}
}
int main (void)
{
Nome *l;
char v;
cria();
push (l, 'e');
push (l, 'l');
push (l, 'i');
push (l, 'a');
push (l, 'n');
push (l, 'e');
imprime(l);
v = pop(l);
imprime(l);
v = pop(l);
imprime(l);
libera(l);
return 0;
}

que tal dizer o que acontece de inesperado?