| 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. |