Просьба собирать glibc с поддержкой TLS. Такая необходимость обнаружилась на crossover 5.0, но есть подозрение, что wine тоже будет очень рад поддержке TLS. Замечу, что wine/crossover работают и при отсутствии поддержки TLS, но при этом могут все же возникать дополнительные проблемы. ЗЫ у себя на localhost пересобрал glibc с комбинацией "--with-tls --without-__thread". Пока что работает без нареканий :)
На каком ядре вы это тестировали?
2.6.12-wks26-up-alt4
В glibc-2.3.6-alt3 включено по умолчанию.
У меня создалось впечатление, что поддержка TLS в glibc-2.3.6-alt3 для i586 не работает. Насколько я понял, опция --without-__thread, используемая при сборке glibc, отключает только использование __thread внутри glibc, но при этом в прочих программах __thread должно работать нормально. Однако следующая программа явно работает неправильно: ======================================================================== #include <stdio.h> #include <stdlib.h> #include <pthread.h> static __thread int var; static int *get_ptr(void) { return &var; } static void *thread_fn(void *p) { printf("thread %d: ptr=%p\n", (int)p, get_ptr()); return NULL; } int main(void) { pthread_t threads[2]; pthread_create(&threads[0], NULL, thread_fn, (void *) 0); pthread_create(&threads[1], NULL, thread_fn, (void *) 1); pthread_join(threads[0], NULL); pthread_join(threads[1], NULL); return 0; } ======================================================================== $ gcc -g -O2 -Wall -W -pthread -o tls tls.c $ ./tls thread 0: ptr=0xb7d7269c thread 1: ptr=0xb7d7269c Оба потока получают один и тот же указатель. Однако, если установить пакет glibc-core-i686, __thread начинает обрабатываться: $ ./tls thread 0: ptr=0x804d25c thread 1: ptr=0x804dddc $ uname -r 2.6.14-std26-up-alt2 На x86_64 тоже работает правильно: $ ./tls thread 0: ptr=0x50455c thread 1: ptr=0x5053bc $ uname -r 2.6.14-vs26-smp-alt2.1
Ну да, так и есть, это же linuxthreads а не nptl. В linuxthreads/sysdeps/i386/tls.h написано: "We can support TLS only if the floating-stack support is available." В нашей схеме сборки для того, чтобы glibc-core-i686 давало реальный TLS, надо и обычный glibc-core собирать с --enable-tls. Не знаю, может и стоило когда-то вместо glibc-core-i686 делать полноценную сборку glibc на i686, тогда было бы проще. С переходом на nptl TLS будет и на i586.
http://sourceware.org/bugzilla/show_bug.cgi?id=2590
Created attachment 1488 [details] linuxthreads.diff TZ=UTC cvs -q -z9 -d :pserver:anoncvs@sources.redhat.com:/cvs/glibc rdiff -u -D'2006/04/26 15:35:00' -D'2006/04/26 15:35:10' linuxthreads/linuxthreads
2ldv: действительно, отсутствие поддержки TLS и приводило к проблемам в виде падения WINE на ALT Linux с ядром 2.6. 2svd: нет ли у вас способа воспроизвести проблему, возникающую в WINE/CrossOver от отсутствия TLS?
(In reply to comment #8) > 2svd: нет ли у вас способа воспроизвести проблему, возникающую в > WINE/CrossOver от отсутствия TLS? Нет, сейчас навскидку не вспомню... Полагаю, можно попробовать установить какой-нить MS Office 2003... Хотя он-то вроде бы устанавливался, только Outlook не работал... Точно помню только то, что про TLS я увидел в логах crossover'а... Если будет время - попробую посмотреть как воспроизвести, но пока что со временем очень туго :(
Впрочем, ругань про TLS сохранилась в логах: Running '"/opt/cxoffice/bin/cxglibc-check" 1>&2' Testing for TLS support... no Testing for errno_location... no Testing for patchable errno_location... yes Testing for pthread library... linuxthreads Testing for TLS after pthread load... no GNU libc version... glibc 2.3.5 ** ERROR **: glibc 2.3.5 without TLS support will not work correctly -> rc=25344
Fixed in 2.3.6-alt5.