Hide Forgot
Description of problem: When building a program with only 1 byte of thread local variables, the variable appears to not be initialised. Version-Release number of selected component (if applicable): [root@dxi0-02 ~]# gcc --version gcc (GCC) 4.6.0 20110603 (Red Hat 4.6.0-10) Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. [root@dxi0-02 ~]# /lib/libc.so.6 GNU C Library stable release version 2.14, by Roland McGrath et al. Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compiled by GNU CC version 4.6.0 20110530 (Red Hat 4.6.0-9). Compiled on a Linux 2.6.38 system on 2011-06-28. Available extensions: Support for some architectures added on, not maintained in glibc core. The C stubs add-on version 2.1.2. crypt add-on version 2.1 by Michael Glad and others GNU Libidn by Simon Josefsson Native POSIX Threads Library by Ulrich Drepper et al BIND-8.2.3-T5B RT using linux kernel aio libc ABIs: UNIQUE IFUNC For bug reporting instructions, please see: <http://www.gnu.org/software/libc/bugs.html>. How reproducible: Every time. Steps to Reproduce: 1. Write this simple example to tls-byte.c: [root@dxi0-02 ~]# cat > tls-byte.c #include <stdio.h> #include <stdint.h> __thread uint8_t foo = 1; int main (void) { printf("foo is %hhu.\n", foo); return 0; } 2. Compile it to produce tls-byte. [root@dxi0-02 ~]# gcc -lpthread tls-byte.c -o tls-byte 3. Run it. [root@dxi0-02 ~]# ./tls-byte Actual results: The program prints "foo is 0." Expected results: The program should print "foo is 1." Interestingly, if foo is changed to a uint16_t, or a second '__thread uint8_t bar' variable is declared (even if it is not initialised), I get the expected result. I have filed this bug on glibc rather than gcc because the TLS header appears to show 1 byte of data, which seems to me to be set correctly: [root@dxi0-02 ~]# readelf -l ./tls-byte | grep TLS -A1 TLS 0x0000000000000714 0x0000000000600714 0x0000000000600714 0x0000000000000001 0x0000000000000001 R 1 [root@dxi0-02 ~]# od --address-radix=x --format=x1 --skip-bytes=0x714 --read-bytes=1 ./tls-byte 000714 01 000715 Apologies if I have misinterpreted this readelf output.
glibc-2.14.90-7 has been submitted as an update for Fedora 16. https://admin.fedoraproject.org/updates/glibc-2.14.90-7
Package glibc-2.14.90-7: * should fix your issue, * was pushed to the Fedora 16 testing repository, * should be available at your local mirror within two days. Update it with: # su -c 'yum update --enablerepo=updates-testing glibc-2.14.90-7' as soon as you are able to. Please go to the following url: https://admin.fedoraproject.org/updates/glibc-2.14.90-7 then log in and leave karma (feedback).
Package glibc-2.14.90-8: * should fix your issue, * was pushed to the Fedora 16 testing repository, * should be available at your local mirror within two days. Update it with: # su -c 'yum update --enablerepo=updates-testing glibc-2.14.90-8' as soon as you are able to. Please go to the following url: https://admin.fedoraproject.org/updates/glibc-2.14.90-8 then log in and leave karma (feedback).
glibc-2.14.90-8 has been pushed to the Fedora 16 stable repository. If problems still persist, please make note of it in this bug report.