www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 12092] New: Wrong TLS access in PIC (X86_32)

reply d-bugmail puremagic.com writes:
https://d.puremagic.com/issues/show_bug.cgi?id=12092

           Summary: Wrong TLS access in PIC (X86_32)
           Product: D
           Version: unspecified
          Platform: x86
        OS/Version: Linux
            Status: NEW
          Keywords: dll, wrong-code
          Severity: major
          Priority: P3
         Component: DMD
        AssignedTo: nobody puremagic.com
        ReportedBy: code dawg.eu



cat > bug.d << CODE
int bar;

int foo()
{
    return bar;
}
CODE

dmd -m32 -c -fPIC bug.d
readelf -r bug.o
----
0000000b  0000160f R_386_TLS_IE      00000000   _D3foo3bari
----

This TLS relocation uses the 'initial exec' model, which is not suited for PIC
code. It should use the 'general dynamic' model (R_386_TLS_GD).

Reference http://www.akkadia.org/drepper/tls.pdf

-- 
Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 06 2014
parent d-bugmail puremagic.com writes:
https://d.puremagic.com/issues/show_bug.cgi?id=12092




I was already able to fix the relocation type and make the compiler call
__tls_get_addr.
https://github.com/MartinNowak/dmd/commits/fix12092
Now I'm stuck!
The code sequence to load the __tls_get_addr argument is incorrect. It ought to
use a LEA with SIB addressing to leave patch room for the linker. Instead it
just uses a simple LEA.

Should be:
  13:    8d 04 1d 00 00 00 00     lea    0x0(,%ebx,1),%eax
  1a:    e8 fc ff ff ff           call   1b <foo+0x1b>

Is:
  17:    8d 81 00 00 00 00        lea    0x0(%ecx),%eax
  1d:    e8 fc ff ff ff           call   1e <_D3foo3fooFZi+0x1e>

-- 
Configure issuemail: https://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
Feb 06 2014