https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82906

            Bug ID: 82906
           Summary: thread_local address not uniqued across shared
                    libraries
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: rafael.espindola at gmail dot com
  Target Milestone: ---

Given

test.h:
inline int *foo() {                                                           
  static thread_local int i = 42;                                             
  return &i;                                                                  
}   

test.cpp:
#include "test.h"                                                             
int *bar() { return foo(); } 

test2.cpp:
#include "test.h"
#include <stdio.h>
int *bar();
int main() {
  printf("%d\n", bar() == foo());
  return 0;
}

If test.cpp is compiled with "gcc -c -O2 -fPIC test.c", the resulting .o has a
R_X86_64_TLSLD R_X86_64_DTPOFF32 pair.

Compiling the rest of the program with

g++ test.o -shared -o test.so"
g++ test2.cpp test.so -o t  -Wl,-rpath="\$ORIGIN"

produces an executable that prints 0 when run. It should print 1, that is,
bar() and foo() should find the same address.

Changing test.o to use general dynamic instead of local dynamic solves the
problem.

Reply via email to