Вопрос: Неопределенная ошибка ссылки _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
2018-04-21 02:04


Источник




Ответы:


Глядя на информацию в вопросе о переполнении стека, я считаю, что проблема связана с тем, что вы статически связываете 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,


4
2018-04-22 13:08



Вот и все! Отлично! Большое спасибо за помощь. Я также свяжу этот ответ с вопросом переполнения стека. - wadesworld
Для меня это не так. Я получаю одни и те же ошибки всякий раз, когда статически связываю все. - Paolo M