Bug 8402 - Build glibc with TLS support
: Build glibc with TLS support
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/glibc)
: unstable
: all Linux
: P2 normal
Assigned To:
:
: http://sourceware.org/bugzilla/show_b...
:
:
:
  Show dependency tree
 
Reported: 2005-11-03 10:30 by
Modified: 2006-10-25 14:00 (History)


Attachments
linuxthreads.diff (6.67 KB, patch)
2006-05-15 19:43, Dmitry V. Levin
no flags Details | Diff


Note

You need to log in before you can comment on or make changes to this bug.


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

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

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

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

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