Bug 8402

Summary: Build glibc with TLS support
Product: Sisyphus Reporter: Sviatoslav Sviridov <svd>
Component: glibcAssignee: placeholder <placeholder>
Status: CLOSED FIXED QA Contact: qa-sisyphus
Severity: normal    
Priority: P2 CC: glebfm, icesik, lav, ldv, placeholder, the_arioch, vsu
Version: unstable   
Hardware: all   
OS: Linux   
URL: http://sourceware.org/bugzilla/show_bug.cgi?id=2590
Attachments:
Description Flags
linuxthreads.diff none

Description Sviatoslav Sviridov 2005-11-03 10:30:02 MSK
Просьба собирать glibc с поддержкой TLS. Такая необходимость обнаружилась на
crossover 5.0, но есть подозрение, что wine тоже будет очень рад поддержке TLS.
Замечу, что wine/crossover работают и при отсутствии поддержки TLS, но при этом
могут все же возникать дополнительные проблемы.

ЗЫ у себя на localhost пересобрал glibc с комбинацией "--with-tls
--without-__thread". Пока что работает без нареканий :)
Comment 1 Dmitry V. Levin 2005-11-09 03:51:13 MSK
На каком ядре вы это тестировали?
Comment 2 Sviatoslav Sviridov 2005-11-09 09:46:21 MSK
2.6.12-wks26-up-alt4
Comment 3 Dmitry V. Levin 2006-01-08 03:16:02 MSK
В glibc-2.3.6-alt3 включено по умолчанию.
Comment 4 Sergey Vlasov 2006-01-22 00:45:49 MSK
У меня создалось впечатление, что поддержка 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
Comment 5 Dmitry V. Levin 2006-01-22 01:53:34 MSK
Ну да, так и есть, это же 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.
Comment 6 Dmitry V. Levin 2006-05-15 19:30:37 MSD
http://sourceware.org/bugzilla/show_bug.cgi?id=2590
Comment 7 Dmitry V. Levin 2006-05-15 19:43:26 MSD
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
Comment 8 Vitaly Lipatov 2006-05-16 18:42:21 MSD
2ldv: действительно, отсутствие поддержки TLS и приводило к проблемам в виде 
падения WINE на ALT Linux с ядром 2.6.

2svd: нет ли у вас способа воспроизвести проблему, возникающую в 
WINE/CrossOver от отсутствия TLS?
Comment 9 Sviatoslav Sviridov 2006-05-16 19:05:25 MSD
(In reply to comment #8)
> 2svd: нет ли у вас способа воспроизвести проблему, возникающую в 
> WINE/CrossOver от отсутствия TLS?

Нет, сейчас навскидку не вспомню... Полагаю, можно попробовать установить
какой-нить MS Office 2003... Хотя он-то вроде бы устанавливался, только Outlook
не работал... Точно помню только то, что про TLS я увидел в логах crossover'а...

Если будет время - попробую посмотреть как воспроизвести, но пока что со
временем очень туго :(
Comment 10 Sviatoslav Sviridov 2006-05-16 19:15:18 MSD
Впрочем, ругань про 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
Comment 11 Dmitry V. Levin 2006-05-16 21:30:55 MSD
Fixed in 2.3.6-alt5.