Erro de referência indefinido _dl_stack_flags com gcc e pthreads

4

Perguntado sobre o StackOverflow, mas a solução sugerida envolve o uso do gcc 3.4.

Pergunta com detalhes completos:

_dl_stack_flags_error pergunta no StackOverflow

No entanto, meu Ubuntu 10:

wade@wadesworld:~$ uname -a
Linux wadesworld 2.6.18-194.8.1.el5.028stab070.5ent #1 SMP Fri Sep 17 19:46:02 MSD 2010 i686 GNU/Linux

só permite, no mínimo, o gcc 4.1.

Alguém viu / resolveu este problema?

    
por wadesworld 21.04.2011 / 04:04

1 resposta

4

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 .

    
por James Henstridge 22.04.2011 / 15:08

Tags