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…