bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug ld/15889] New: Follow microsoft convention for naming of __stdcall


From: sven.koehler at gmail dot com
Subject: [Bug ld/15889] New: Follow microsoft convention for naming of __stdcall function in PE-Export table
Date: Sun, 25 Aug 2013 11:36:46 +0000

http://sourceware.org/bugzilla/show_bug.cgi?id=15889

            Bug ID: 15889
           Summary: Follow microsoft convention for naming of __stdcall
                    function in PE-Export table
           Product: binutils
           Version: 2.23
            Status: NEW
          Severity: enhancement
          Priority: P2
         Component: ld
          Assignee: unassigned at sourceware dot org
          Reporter: sven.koehler at gmail dot com

When creating shared libraries (i.e. DLLs) using mingw-w64 or mingw32
toolchains, the names of functions in the PE-Export table of the DLL differs
from the naming convention that the microsoft linker follows. Consider the
following example:

Compile the source code
  #define EXPORT __declspec(dllexport)
  EXPORT int __cdecl fooC(int x) { return x; }
  EXPORT int __stdcall fooStd(int x) { return x; }
  EXPORT int __fastcall fooFast(int x) { return x; }

with the command
  i686-w64-mingw32-gcc -shared -o export.dll export.c

According to i686-w64-mingw32-objdump -x export.dll, the export table looks
like this:

Export Address Table -- Ordinal Base 1
        [   0] +base[   1] 14d2 Export RVA
        [   1] +base[   2] 14c0 Export RVA
        [   2] +base[   3] 14c8 Export RVA

[Ordinal/Name Pointer] Table
        [   0] @address@hidden
        [   1] fooC
        [   2] address@hidden

However, create a DLL from the same source with microsoft tools would yield the
following export table:

Export Address Table -- Ordinal Base 1
        [   0] +base[   1] 14d2 Export RVA
        [   1] +base[   2] 14c0 Export RVA
        [   2] +base[   3] 14c8 Export RVA

[Ordinal/Name Pointer] Table
        [   0] @address@hidden
        [   1] fooC
        [   2] address@hidden


The only different is the underscore, which ld removes, but microsoft linker
does not remove. The different behaviour is well known (see
http://wyw.dcweb.cn/stdcall.htm for example) and workarounds like the --kill-at
switch have been introduced. Note that the names in the export table for
__cdecl and __fastcall calling conventions are identical in both cases.

It seems that __stdcall is a calling convention frequently used when writing
DLLs. The different naming conventions in the export table cause trouble in
scenarios where a DLL but is not intended to be linked into an application
using an import lib, but is to be a "plug-in" to some other application which
uses LoadLibrary and GetProcAddress. Such may expect the names in the export
table to follow the microsoft conventions. In my case, the application is a JVM
and my DLL is a JNI library. Also, the --kill-at workaround works for me.

However, it is not clear to my why the naming-conventions have never been
adjusted to follow microsoft's design more closely. Doing so would be very
convenient to users. Thus I'd hereby like to make that request.


To the best of my knowledge this change will not effect any users that link
using import libs and should thus not have any serious side-effects.

-- 
You are receiving this mail because:
You are on the CC list for the bug.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]