On 11/17/2013 9:25 PM, Daniel Murphy wrote:
"Walter Bright" <newshou...@digitalmars.com> wrote in message
news:l6c7gt$27fc$1...@digitalmars.com...
Right, I was saying the indirection still exists.
No, not really, at least not on Windows. Try calling a function in the
Windows API and disassemble it. You'll see a direct call.
You sure about that?
src:
import core.sys.windows.windows;
void main()
{
auto x = GetModuleHandleA(null);
}
obj:
__Dmain PROC NEAR
; COMDEF __Dmain
push 0 ; 0000 _ 6A, 00
call dword ptr [__imp__GetModuleHandleA@4] ; 0002 _ FF. 15,
00000000(segrel)
xor eax, eax ; 0008 _ 31. C0
ret ; 000A _ C3
__Dmain ENDP
exe:
?_0072 LABEL NEAR
push 0 ; 00402010 _ 6A, 00
call dword ptr [?_0067] ; 00402012 _ FF. 15,
00401794(d)
xor eax, eax ; 00402018 _ 31. C0
ret ; 0040201A _ C3
Try this:
extern (Windows) int GetModuleHandleA(char*);
void main()
{
auto x = GetModuleHandleA(null);
}
and it compiles and links and runs. No indirection (in the object file, the
indirection is supplied by linker, triggered by an impdef record in
kernel32.lib). The "export" isn't actually needed.