Can GDC make DLLs?
Iain Buclaw
ibuclaw at ubuntu.com
Sun Feb 24 01:38:44 PST 2013
On 23 Feb 2013 22:00, "Ben Davis" <entheh at cantab.net> wrote:
>
> On 23/02/2013 18:38, Iain Buclaw wrote:
>>
>>
>> On Feb 23, 2013 6:20 PM, "Ben Davis" <entheh at cantab.net
>> <mailto:entheh at 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?
GDC TLS is differrent to whatever DMD uses, so assembly code that works for
DMD may not necessarily be correct for GDC.
Regards
----
Iain Buclaw
*(p < e ? p++ : p) = (c & 0x0f) + '0';
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.puremagic.com/pipermail/d.gnu/attachments/20130224/cdc50310/attachment.html>
More information about the D.gnu
mailing list