From mboxrd@z Thu Jan 1 00:00:00 1970 From: Gunther Ebert To: Colin Peters Cc: gnu-win32@cygnus.com Subject: Re: .def files for stdcall functions (was: linking problems with the minimalist version) Date: Fri, 12 Sep 1997 04:40:00 -0000 Message-id: <341929EF.3DFD@ixos-leipzig.de> References: <01BCBF89.A3905060@gbird0> X-SW-Source: 1997-09/msg00227.html Colin Peters wrote: > > My beef with all this is: why does GCC do it this way at all? What purpose > does the @NN serve? After all, GCC knows how to generate the correct > function call given a prototype, it *generates* the @NN, so it doesn't > need it to know what to do. I see some benefit in this naming convention. Sometimes it happens that the compiler generates the wrong code (and as a result the wrong symbol name) of a function. This happens when the function prototype contains parameters which are less than 4 bytes in size. For example, if you used a function extern int _stdcall foo(char c); void bar() { ... foo('a'); ... } the compiler would generate (in order to call the 'foo' routine) a statement putting a single-byte character on the stack and a call statement for the external function '_foo@1'. No problem, if the foo function had been compiled by gcc. If it has been compiled with MSVC (and all Windows NT or Windows 95 DLLs have been compiled with some kind of MSVC) not only one single byte parameter would be expected by the called function but a DWORD (MSVC does DWORD alignment for parameters and gcc doesn't). If the linkage would be successful the foo function would remove the wrong number of bytes from the stack (remember: _stdcall convention) before it returns which would result in an unpredictable behaviour of the program. This kind of problem is hard to find out. If you have ever used the RSXNT package you would probably know this problem, because the EMX (or on Win32 RSX) port of gcc creates plain names (without the '@nn' suffix) also for _stdcall functions, but it doesn't align parameters (in fact, this costed me some nights of debugging). In other words: 1) If there are any problems with wrong or missing prototypes for _stdcall functions the linker would complain with an 'unresolved external' message. You will never get a program with wrong function calls. 2) In order to get all Win32 API functions working there must not be any function prototype containing parameters which are less than 4 bytes in size, even if the parameters are actually WORD or CHAR or BYTE or something else. Please check your windows header files if they contain prototypes with WORD or CHAR parameters. Replace WORD or CHAR parameters by DWORD parameters. > I don't think any other compilers add on @NN > to the names of WINAPI functions like this. Why doesn't GCC just use the > plain function name and call it with PASCAL calling convention? Someone > please enlighten me. > In fact, MSVC mangles _stdcall names in the same manner as Cygnus gcc does. Gunther -- Gunther Ebert iXOS Anwendungs-Software GmbH Angerstrasse 40-42 D-04177 Leipzig Phone : +49 341 48503-0 Fax : +49 341 48503-99 E-mail: mailto:gunther.ebert@ixos-leipzig.de www : http://www.ixos-leipzig.de - For help on using this list (especially unsubscribing), send a message to "gnu-win32-request@cygnus.com" with one line of text: "help".