A biblioteca está funcionando bem. O programa informa o valor correto, mesmo quando executado em gdb. O bug parece estar na maneira como o gdb está avaliando a expressão e forçando o programa alvo a chamar a função. Eu estou vendo esse mesmo comportamento em 10.04 também. Estranhamente p printf ("foo \ n") imprime corretamente 4.
Parece que o gdb está confuso porque o strlen é interno. Se você fizer isso:
int (* len) (char *) = strlen;
E então, gdb print len ("foo") você obtém o resultado correto.