On 23/02/2013 18:38, Iain Buclaw wrote:
On Feb 23, 2013 6:20 PM, "Ben Davis" <ent...@cantab.net
<mailto:ent...@cantab.net>> wrote:
>
> Hi,
>
> Has anyone had any success using GDC to make DLLs to be called from
C/C++?
>
> The reason I ask is, for me, the following snippet inside dll.d /
dll_fixTLS() seems to have compiled to a call to abort():
>
> void** peb;
> asm
> {
> mov EAX,FS:[0x30];
> mov peb, EAX;
> }
>
> and thus dll_process_attach() crashes the process.
>
> It seems like a bug that would affect more people than just me, yet I
couldn't find any evidence of other people hitting it. Have I got it
right what's happening, or is something else at work?
>
> If I'm right, then I'm just wondering if anyone has any ideas on
whether it could be fixed, and how?
>
> Also, I found some discussion about D-style inline asm being
problematic and worthy of removal, but didn't find any explanation as to
what those problems were. I'm curious :)
>
Only because shared libraries requires PIC, and quite a few of the IASM
routines clobber the pic register.
I see. :)
I've managed to build my DLL with a replacement for dll.d, using
GCC-style inline asm for the offending block. Now I've run into another
problem. This code crashes:
static bool tlsCtorRun;
static this() { tlsCtorRun = true; }
64841F0F 8B 15 D4 E2 95 64 mov edx,dword ptr ds:[6495E2D4h]
64841F15 64 A1 2C 00 00 00 mov eax,dword ptr fs:[0000002Ch]
64841F1B 8B 04 90 mov eax,dword ptr [eax+edx*4]
64841F1E C6 80 1C 50 96 64 01 mov byte ptr _tls_start+4
(6496501Ch)[eax],1 <-- this line crashes
64841F25 5D pop ebp
64841F26 C3 ret
It works when built with DMD. The code is functionally identical, and
gets identical values (give or take some randomless with exact memory
layout), with one exception: the offending line effectively says "byte
ptr [eax+10h]" instead. So the constant displacement in the instruction
is 10h instead of 6496501Ch.
I'm no expert on how DLLs are loaded, but I think I've ruled out any
load-time code offset adjustment - because I found the exact sequence of
code bytes in the DLL file on disk, including that number 6496501Ch and
all the surrounding code mnemonics.
Is this a compiler TLS codegen bug?