delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/1998/05/29/01:28:40

From: fjh AT cs DOT mu DOT OZ DOT AU (Fergus Henderson)
Subject: Re: dll question
29 May 1998 01:28:40 -0700 :
Message-ID: <19980529110416.61887.cygnus.gnu-win32@mundook.cs.mu.OZ.AU>
References: <m0yepeD-00117KC AT malasada DOT lava DOT net>
Mime-Version: 1.0
To: Tim Newsham <newsham AT lava DOT net>
Cc: gnu-win32 AT cygnus DOT com

On 27-May-1998, Tim Newsham <newsham AT lava DOT net> wrote:
> 
>      I have a program which is trying to load a dll at runtime.  The
> program uses LoadLibraryEx to load the library in, then uses GetProcAddress
> to get addresses of various entry points (with appropriate cast operations).
> This much seems to work properly.  I am having problems, however, when
> I try to actually call one of the procedures.  The stack pointer (esp)
> seems to be incorrect after a call to the procedure.  In particular
> I am passing in 3 4-byte arguments (12 bytes).  The emitted code
> looks like:
> 
>     <push args>
>     call *%ebx
>     addl %0xc, %esp
> 
> After the call, the stack pointer seems to be off by 12 bytes (too high).
> Its as if the called procedure popped the arguments itself, leaving
> the stack as it was prior to the caller pushing, and then the caller
> also added 12 to the stack pointer to pop the values, after the function
> returned.
> 
> Is this analysis correct?

Yes, it looks like the called procedure is using the "stdcall"
calling convention rather than the default "cdecl" calling convention.

> If so,  is there some way to tell the compiler that the callee will be
> restoring the stack and that the caller shouldn't bother?

Yes, use `__attribute__((stdcall))' on the declaration of
the function pointer which you use to call the function.
See the "function attributes" section in the "C extensions"
section of the gcc documentation.

-- 
Fergus Henderson <fjh AT cs DOT mu DOT oz DOT au>  |  "I have always known that the pursuit
WWW: <http://www.cs.mu.oz.au/~fjh>  |  of excellence is a lethal habit"
PGP: finger fjh AT 128 DOT 250 DOT 37 DOT 3        |     -- the last words of T. S. Garp.
-
For help on using this list (especially unsubscribing), send a message to
"gnu-win32-request AT cygnus DOT com" with one line of text: "help".

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019