Summary: | Build glibc with TLS support | ||||||
---|---|---|---|---|---|---|---|
Product: | Sisyphus | Reporter: | Sviatoslav Sviridov <svd> | ||||
Component: | glibc | Assignee: | Gleb F-Malinovskiy <glebfm> | ||||
Status: | CLOSED FIXED | QA Contact: | qa-sisyphus | ||||
Severity: | normal | ||||||
Priority: | P2 | CC: | glebfm, icesik, lav, ldv, the_arioch, vsu | ||||
Version: | unstable | ||||||
Hardware: | all | ||||||
OS: | Linux | ||||||
URL: | http://sourceware.org/bugzilla/show_bug.cgi?id=2590 | ||||||
Attachments: |
|
Description
Sviatoslav Sviridov
2005-11-03 10:30:02 MSK
На каком ядре вы это тестировали? 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. 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. |