delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/1997/04/22/08:37:31

From: root AT jacob DOT remcomp DOT fr (root)
Subject: Re: NEED HELP: linking an exe with windows lib files
22 Apr 1997 08:37:31 -0700 :
Approved: cygnus DOT gnu-win32 AT cygnus DOT com
Distribution: cygnus
Message-ID: <m0wJeEN-000AK1C.cygnus.gnu-win32@jacob.remcomp.fr>
Original-To: john DOT lewis AT syspac DOT com (John A. Lewis)
Original-Cc: gnu-win32 AT cygnus DOT com
In-Reply-To: <335C1A97.5D6A14A1@syspac.com> from "John A. Lewis" at Apr 21, 97 06:55:35 pm
Original-Sender: owner-gnu-win32 AT cygnus DOT com

> 
> Come on gang...someone must know what to do about this...  Help me out
> here!
> 
> John A. Lewis wrote:
> > 
> > I am trying to build an executable which links in some libraries which
> > are intended for windows.  The symbols in these libraries have the _ in
> > front of them, which gcc seems to handle, and @4, @8, @12, etc. behind
> > them, which gcc does not seem to handle.  I am kind of a novice here, so
> > I have no idea what to do about this.
> > 
> > Any recommendations on how to fix this?
> > 

Look john: when that '@' symbol appears in a function, it means that its calling
convention is _stdcall, i.e. the arguments to it are pushed in the normal 
fashion for C functions, but it is the called function that cleans up the
stack.

This means that if you prototype correctly your calls, using the same headers
the library was built with, YOUR calls will have the '@' appended to them too,
and the link will work.

Your problem is a problem of using the right headers, and prototyping all
functions that have the _stdcall feature.

Imagine what would happen if the link would work:
You call the function 'foo' in your code, and after the call, the compiler
adds the size of the pushed arguments to the stack to adjust it:
	push	arg2
	push	arg1
	call	foo
	add	$8,%esp

Since foo is a _stdcall function, it would ALREADY have substracted the 8
from the stack, and when that code is run, the stack would be in a MESS!

When you declare that function 'foo' as stdcall, the compiler will
generate:
	push	arg2
	push	arg1
	call	foo AT 8

and nothing more, so everything will work OK.

What you have to do now is to use the same prototypes as the guys used for
building that library. That's all.


-- 
Jacob Navia	Logiciels/Informatique
41 rue Maurice Ravel			Tel 01 48.23.51.44
93430 Villetaneuse 			Fax 01 48.23.95.39
France
-
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