[GHC] #5987: Too many symbols in ghc package DLL
GHC
ghc-devs at haskell.org
Wed Jan 6 00:41:31 UTC 2016
#5987: Too many symbols in ghc package DLL
---------------------------------+----------------------------------------
Reporter: igloo | Owner:
Type: bug | Status: new
Priority: normal | Milestone: 8.0.1
Component: Compiler | Version: 7.5
Resolution: | Keywords:
Operating System: Windows | Architecture: Unknown/Multiple
Type of failure: None/Unknown | Test Case:
Blocked By: | Blocking: 5355
Related Tickets: | Differential Rev(s):
Wiki Page: |
---------------------------------+----------------------------------------
Comment (by rassilon):
Replying to [comment:46 bgamari]:
>
> My understanding of this situation is that it is not an intrinsic
limitation of PE. The relevant data structures are the `.edata` and
`.idata` tables which are defined in sections 63 and 64 of the PE/COFF
specification. The specification specifies that one means of referring to
exported symbols is via a 16-bit ordinal. However, this is not the only
way; if the lookup fails the loader will fall back to a standard name
search. Indeed, Microsoft even explicitly says that ordinals
[[https://msdn.microsoft.com/en-us/library/hyx1zcd3.aspx|are a legacy
artifact]] and their use is discouraged in new code (this document
describes the `.def` format, but the idea still applies),
>
Your understanding doesn't match my understanding of the PE/COFF
specification. Page 75 of the 02/06/2013 version of the spec which is the
page where the Export Ordinal Table of the `.edata` section is described.
The section includes pseudo-code explaining how the SymbolRVA of a named
symbol is determined:
i = Search_ExportNameTable(ExportName);
ordinal = ExportOrdinalTable[i];
SymbolRVA = ExportAddressTable[ordinal - ordinalBase];
So, the problem isn't with this pseudo-code, but the pseudo-code combined
with the Export Ordinal Table being defined as:
> > `The export ordinal table is an array of 16-bit indexes into the
address table.`
This is especially sad, since the Address Table Entries field of the
Export Directory Table is 32 bits of data.
The text you quote below is from the syntax of .DEF files explaining why
16-bit DLLs, didn't include exported symbol string names and utilized the
ordinal number as the ONLY `API` between DLLs. The documentation you quote
is recommending usage of string symbols for providing a cross-DLL `API`
resolution and only using the ordinal `API` for legacy reasons. The
documentation doesn't mean to imply that ordinals are optional (based on
my reading of the PE/COFF sections about .edata).
> > You can use @ordinal to specify that a number, and not the function
name, will go into the DLL's export table. Many Windows DLLs export
ordinals to support legacy code. It was common to use ordinals in 16-bit
Windows code, because it can help minimize the size of a DLL. We don’t
recommend exporting functions by ordinal unless your DLL’s clients need it
for legacy support. Because the .LIB file will contain the mapping between
the ordinal and the function, you can use the function name as you
normally would in projects that use the DLL.
>
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/5987#comment:48>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list