Thread local storage not working with -fPIC and shared objects

Pieter de Goeje pieter at degoeje.nl
Sat Mar 31 02:50:14 UTC 2007


Hello List,

I have these files:
--- loader.cpp ---
#include <stdio.h>
#include "tls.h"

int main() {
        tls = 0;
        printf("%d\n", tls);
}

--- tls.cpp ---
#include "tls.h"
int __thread tls;

--- tls.h ---
extern __thread int tls;

When I compile them like this:
c++ -fPIC -o tls.so tls.cpp -shared
c++ -fPIC -o loader loader.cpp tls.so

And run the resulting program, I get:
pyotr at nox:~/projects/misc/tls> ./loader
/libexec/ld-elf.so.1: ./loader: Unsupported relocation type 37 in non-PLT 
relocations

When I omit -fPIC, it runs fine. But I need fPIC for the shared object on 
amd64 arch. I've tried it on Linux/i386 (gcc 4.1) and it ran fine (with 
fPIC).

Much to my surprise however, a particularly large application I'm working on 
did compile & run on FreeBSD/amd64 using -fpic (lowercase) and gcc 4.3. 
Trying -fpic on FreeBSD/i386 resulted in failure.

FYI, I need tls to work because I'm using OpenMP's tls (#pragma omp 
threadprivate()) support in gcc 4.3.

The workaround I found on FreeBSD/amd64 was linking the main executable 
with -fno-PIC, or building everything with -fpic. (both workarounds didn't 
work on FreeBSD/i386)

I would be grateful if someone could shed some light on this.

Regards,
Pieter de Goeje


More information about the freebsd-hackers mailing list