Microsoft KB Archive/128599

= FIX: More Than 65536 Export Entries May Cause LNK2001 Errors =

Article ID: 128599

Article Last Modified on 10/24/2003

-

APPLIES TO

 The Linker (LINK.EXE), when used with:  Microsoft Visual C++ 2.0 Professional Edition

 Microsoft Visual C++ 2.1 

-



This article was previously published under Q128599



SYMPTOMS
When linking to an import library, you may get unresolved external errors (LNK2001) on objects that are exported using the __declspec(dllexport) attribute. This problem is most common when exporting a large number of classes from a DLL.



CAUSE
The compiler generates export directives for each definition of an exported object in a source file. The linker combines these into a list when generating the executable that is translated into an import library.

The linker fails to distinguish between distinct and non-distinct (or duplicate) export directives. Because Win32 is limited to 64 KB of ordinals per DLL, the linker uses a two-byte unsigned integer to count the exports. The unsigned integer counter wraps around after counting 65536 exports. This results in smaller than expected import libraries.

This is only a problem in large DLLs that export a lot of information.



RESOLUTION
Here are three possible workarounds for this problem:

 Use conditional compilation to limit what is exported from each .OBJ file. Please see the sample pseudo-code provided below for an example.</li>  Export your objects using a DEF file. The best way to ensure you export the correct symbols is to use a .MAP file. You can copy and paste the decorated symbols into the .DEF file. For example: <pre class="fixed_text">  SAMPLE.DEF --

LIBRARY SAMPLE

EXPORTS ?showsub1@@YAXXZ ?sub1@@YAHH@Z ??0sub1test@@QAE@XZ ??1sub1test@@QAE@XZ </li> Divide your DLL into multiple DLLs by functionality. While this may involve the most work to implement, modularity may offer long term benefits.</li></ul>

<div class="status_section">

STATUS
Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem was fixed in Microsoft Visual C++, 32-bit Edition, version 4.0.

<div class="moreinformation_section">

MORE INFORMATION
The following sample code illustrates how to conditionally compile code to avoid the problem. An example showing how to generate this bug would be too large to attach to this article because the source code would have to export more than 65536 symbols.

Sample Code
/* Compiler options needed: default DLL compiler options

A.H ---


 * 1) if defined (A_OBJ)
 * 2) define DeclSpec __declspec(dllexport)
 * 3) else
 * 4) define DeclSpec
 * 5) endif

class DeclSpec AObject { public: AObject; ~AObject; };

B.H ---


 * 1) if defined (B_OBJ)
 * 2) define DeclSpec __declspec(dllexport)
 * 3) else
 * 4) define DeclSpec
 * 5) endif

class DeclSpec BObject { public: BObject; ~BObject; };


 * 1) undef DeclSpec

A.CPP -

// Alternatively, you can define A_OBJ in the Preprocessor field of // your compiler settings in the Project Settings dialog box.
 * 1) define A_OBJ
 * 1) include "a.h"
 * 2) include "b.h"

AObject::AObject { }

AObject::~AObject { }

B.CPP -


 * 1) define B_OBJ
 * 2) include "a.h"
 * 3) include "b.h"

BObject::BObject { }

BObject::~BObject { }

Additional query words: 2.00 2.10 9.00 9.10

Keywords: kbbug kbfix kbcode KB128599

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.