digitalmars.D.bugs - [Issue 12092] New: Wrong TLS access in PIC (X86_32)
- d-bugmail puremagic.com (32/32) Feb 06 2014 https://d.puremagic.com/issues/show_bug.cgi?id=12092
- d-bugmail puremagic.com (18/18) Feb 06 2014 https://d.puremagic.com/issues/show_bug.cgi?id=12092
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
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