Olhando as informações na sua pergunta sobre estouro de pilha, acredito que o problema se deve a você vincular estaticamente libpthread
. Eu montei o seguinte programa de teste trivial:
#include <pthread.h>
static void *
thread_start(void *arg)
{
}
int
main(int argc, char **argv)
{
pthread_t thread_id = 0;
void *result = NULL;
pthread_create(&thread_id, NULL, &thread_start, NULL);
pthread_join(thread_id, &result);
}
Se eu compilar com gcc -o test test.c -lpthread
, não recebo erros. Se eu tentar vincular o encadeamento estaticamente, mas tudo o mais dinamicamente, recebo vários erros, incluindo o erro _dl_stack_flags
ausente:
$ gcc -o test test.c -Wl,-Bstatic -lpthread -Wl,-Bdynamic
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../libpthread.a(pthread_create.o): In function 'allocate_stack':
/build/buildd/eglibc-2.13/nptl/allocatestack.c:451: undefined reference to '_dl_stack_flags'
/build/buildd/eglibc-2.13/nptl/allocatestack.c:595: undefined reference to '_dl_stack_flags'
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../libpthread.a(ptw-pause.o): In function '__pause_nocancel':
/build/buildd/eglibc-2.13/nptl/../sysdeps/unix/syscall-template.S:82: undefined reference to '__syscall_error'
/build/buildd/eglibc-2.13/nptl/../sysdeps/unix/syscall-template.S:82: undefined reference to '__syscall_error'
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../libpthread.a(nptl-init.o): In function '__pthread_initialize_minimal_internal':
/build/buildd/eglibc-2.13/nptl/nptl-init.c:277: undefined reference to '__libc_setup_tls'
/build/buildd/eglibc-2.13/nptl/nptl-init.c:295: undefined reference to '_dl_cpuclock_offset'
/build/buildd/eglibc-2.13/nptl/nptl-init.c:437: undefined reference to '_dl_init_static_tls'
/build/buildd/eglibc-2.13/nptl/nptl-init.c:439: undefined reference to '_dl_wait_lookup_done'
collect2: ld returned 1 exit status
Você não listou esses erros adicionais, mas suponho que eles também apareceram para você. Eu suspeito que esse erro só ocorra se você tentar vincular estaticamente libpthread
, mas vincular dinamicamente libc
. Se você ligar dinamicamente as duas coisas funcionam, e eu suspeito que, se você vincular estaticamente ambos, eu suspeito que isso funcionaria também. Isso não é surpreendente, uma vez que as duas bibliotecas estão bastante relacionadas.
Então, sugiro que você ajuste sua configuração de compilação para vincular dinamicamente libpthread
.