Неопределенная ошибка ссылки _dl_stack_flags с gcc и pthreads

Задано на StackOverflow, но предлагаемое решение включает в себя использование gcc 3.4.

Вопрос с полной информацией:

_dl_stack_flags_error вопрос о StackOverflow

Однако, мой 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

позволяет только gcc 4.1 как минимум.

Кто-нибудь видел / решил эту проблему?

4
задан 23 May 2017 в 15:39

1 ответ

Глядя на информацию в вашем вопросе о переполнении стека, я считаю, что проблема в том, что вы статически связываете libpthread. Я собрал следующую тривиальную тестовую программу:

#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);
}

Если я скомпилирую ее с gcc -o test test.c -lpthread, я не получу ошибок. Если я пытаюсь связать поток статически, но все остальное динамически, я получаю ряд ошибок, включая отсутствующую ошибку _dl_stack_flags:

$ 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

Вы не перечислили эти дополнительные ошибки, но я предполагаю, что они появились для тебя тоже. Я подозреваю, что эта ошибка возникает, только если вы пытаетесь статически связать libpthread, но динамически связать libc. Если вы динамически связываете обе вещи, и я подозреваю, что если вы статически связываете обе, я подозреваю, что это тоже сработает. Это не удивительно, так как две библиотеки довольно тесно связаны.

Поэтому я бы предложил настроить конфигурацию вашей сборки так, чтобы она динамически связывалась libpthread.

0
ответ дан 23 May 2017 в 15:39

Другие вопросы по тегам:

Похожие вопросы: