"Export ordinal too large" when linking LLVM.dll with MinGW64

Hi,

Trying to build llvm.dll (8.0.0) with mingw64 (gcc 8.1.0) using cmake.
After linking for hours and consuming some 7GB of RAM, ld.exe finally
bails out with:

X:/tools/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/8.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe:
Error: export ordinal too large: 283482

The command I used is:
cmake \
-DLLVM_TARGETS_TO_BUILD=X86 \
-DCMAKE_BUILD_TYPE=Debug \
-DLLVM_LINK_LLVM_DYLIB=ON \
-DLLVM_BUILD_TOOLS=OFF \
-DCMAKE_SHARED_LINKER_FLAGS="-t" \
-DCMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS="-t" \
-G "MinGW Makefiles"

Am I doing something wrong? Did anyone managed to get a LLVM.dll with
this toolchain?

Update: looks like the the problem was that the cmake script in
tools/llvm-shlib was set to export all symbols instead of just the C
symbols, and those are way too many (max is 65535).

Changing tools\llvm-shlib\simple_version_script.map.in to read "LLVM_8
{ global: LLVM*; local: *; };" fixed it for me and now I have a dll.

Just ran into the same problem, but with -DLLVM_BUILD_TOOLS=ON since the tools link against shlib and use the C++ interface I can’t use Cosmin’s solution. I managed to get through with using RelWithDebInfo instead of Debug

IIUC, it is the COFF file format limitation that you can export only up to 65535 symbols from a DLL. The Export Ordinal Table in the COFF file is an array of 16-bit indices to Export Address Table, so it can’t export symbols more than 2^16. I don’t know if there’s a workaround for this issue – I googled it and found that several open-source project faced the issue and some of them decided to split a DLL into multiple ones, but I don’t think we want to do that…

Ultimately I think LLVM needs to add export annotations to the source code. This would drastically cut down on the number of exported symbols.

There was a recent attempt to start something like this in https://reviews.llvm.org/D54439, but I guess it is currently reverted.