[cfe-dev] Clang Plugin for Msys2's mingw x86_64-w64-windows
Michael Kruse via cfe-dev
cfe-dev at lists.llvm.org
Tue May 26 03:12:09 PDT 2020
clang/LLVM does not support dynamically loaded plugins on Windows. The
reasons are that
1. importing symbols require specifying which binary they are loaded
from. That is, clang.exe, clang++.exe, libLLVM.dll or clang-cpp.dll
2. There is a limit of ~2^16 exported symbols per dll. LLVM alone
already has more symbols.
Also see the thread
http://lists.llvm.org/pipermail/cfe-dev/2020-March/064919.html
Michael
Am Mo., 25. Mai 2020 um 17:31 Uhr schrieb mark via cfe-dev
<cfe-dev at lists.llvm.org>:
>
> Hello there,
>
> I am trying to create a simple Clang plugin and test it on my Windows host with Msys2's mingw x86_64-w64-windows toolchain. The issue is that clang is failing to "find" the plugin after loading windows plugin dll. Can you please help me to figure out what is wrong here? I am very new to clang and the plugin framework. Thank you for any suggestion, Mark
>
> 1. creating plugin dll:
>
> $ make -f makefile.mk
> clang++ -c -std=c++14 -fno-exceptions -fno-rtti -D_FILE_OFFSET_BITS=64 -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I. -Ic:/msys64/mingw64/include example_plugin_clang.cpp -o example_plugin_clang.o
> clang++ -shared example_plugin_clang.o -static -o example-plugin-clang.dll -Lc:/msys64/mingw64/lib c:/msys64/mingw64/lib/libclang-cpp.dll.a c:/msys64/mingw64/lib/libLLVM.dll.a
>
> 2. test run:
>
> $ make -f makefile.mk test
> clang++ -Xclang -load -Xclang <CURDIR> /example-plugin-clang.dll -Xclang -add-plugin -Xclang example-plugin-clang -c -std=c++11 example_cpp_class.cc -o example_cpp_class.o
> error: unable to find plugin 'example-plugin-clang'
> 1 error generated.
> mingw32-make: *** [makefile.mk:86: example_cpp_class.o] Error 1
>
> ...
> $ nm example-plugin-clang.dll | grep example
> 00000000701c1cb0 t _GLOBAL__sub_I_example_plugin_clang.cpp
> 00000000701e9020 b _ZL26_example_plugin_clang_node
>
> per example_plugin_clang.cpp:
>
> static FrontendPluginRegistry::Add<FindDependenciesAction>
> _example_plugin_clang_node(/*plugin Name=*/ "example-plugin-clang",
> /*plugin Description=*/ "Print out header dependencies");
>
> $ ntldd example-plugin-clang.dll
> libclang-cpp.dll => C:\msys64\mingw64\bin\libclang-cpp.dll (0x0000000000e10000)
> KERNEL32.dll => C:\WINDOWS\SYSTEM32\KERNEL32.dll (0x0000000005690000)
> msvcrt.dll => C:\WINDOWS\SYSTEM32\msvcrt.dll (0x00000000006d0000)
>
> ***
>
> I tried an example for GCC plugin with the Msys2 GCC toolchain and this works:
>
> $ make -f makefile.mk
> g++ -c -std=c++11 -Wno-literal-suffix -fno-exceptions -fno-rtti -I. -Ic:/msys64/mingw64/include -Ic:/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/9.3.0/plugin/include example_plugin_gcc.cpp -o example_plugin_gcc.o
> g++ -shared example_plugin_gcc.o -static -o example-plugin-gcc.dll c:/msys64/mingw64/lib/gcc/x86_64-w64-mingw32/9.3.0/plugin/cc1plus.exe.a
>
> $ make -f makefile.mk test
> g++ -fplugin=C:/Users/msx/demo/plugin/example-plugin-gcc.dll -c -std=c++11 example_cpp_class.cc -o example_cpp_class.o
> Plugin info
> ===========
>
> Base name: example-plugin-gcc
> Full name: C:/Users/msx/demo/plugin/example-plugin-gcc.dll
> Number of arguments of this plugin:0
>
> Version info
> ============
>
> Base version: 9.3.0
> Date stamp: 20200312
> Dev phase:
> Revision:
> Configuration arguments: ../gcc-9.3.0/configure --prefix=/mingw64 --with-local-prefix=/mingw64/local --build=x86_64-w64-mingw32 --host=x86_64-w64-mingw32 --target=x86_64-w64-mingw32 --with-native-system-header-dir=/mingw64/x86_64-w64-mingw32/include --libexecdir=/mingw64/lib --enable-bootstrap --with-arch=x86-64 --with-tune=generic --enable-languages=c,lto,c++,fortran,ada,objc,obj-c++ --enable-shared --enable-static --enable-libatomic --enable-threads=posix --enable-graphite --enable-fully-dynamic-string --enable-libstdcxx-filesystem-ts=yes --enable-libstdcxx-time=yes --disable-libstdcxx-pch --disable-libstdcxx-debug --disable-isl-version-check --enable-lto --enable-libgomp --disable-multilib --enable-checking=release --disable-rpath --disable-win32-registry --disable-nls --disable-werror --disable-symvers --enable-plugin --with-libiconv --with-system-zlib --with-gmp=/mingw64 --with-mpfr=/mingw64 --with-mpc=/mingw64 --with-isl=/mingw64 --with-pkgversion='Rev2, Built by MSYS2 project' --with-bugurl=https://sourceforge.net/projects/msys2 --with-gnu-as --with-gnu-ld
>
> Plugin successfully initialized
>
> *** Other relevant info for clang plugin build ***
>
> $ ldd example-plugin-clang.dll
> ntdll.dll => /c/WINDOWS/SYSTEM32/ntdll.dll (0x7fff6fb30000)
> KERNEL32.DLL => /c/WINDOWS/System32/KERNEL32.DLL (0x7fff6f890000)
> KERNELBASE.dll => /c/WINDOWS/System32/KERNELBASE.dll (0x7fff6c610000)
> msvcrt.dll => /c/WINDOWS/System32/msvcrt.dll (0x7fff6d540000)
> libclang-cpp.dll => /c/msys64/mingw64/bin/libclang-cpp.dll (0x67400000)
> ADVAPI32.dll => /c/WINDOWS/System32/ADVAPI32.dll (0x7fff6d020000)
> sechost.dll => /c/WINDOWS/System32/sechost.dll (0x7fff6e2c0000)
> zlib1.dll => /mingw64/bin/zlib1.dll (0x62e80000)
> RPCRT4.dll => /c/WINDOWS/System32/RPCRT4.dll (0x7fff6cec0000)
> ole32.dll => /c/WINDOWS/System32/ole32.dll (0x7fff6d300000)
> combase.dll => /c/WINDOWS/System32/combase.dll (0x7fff6de50000)
> ucrtbase.dll => /c/WINDOWS/System32/ucrtbase.dll (0x7fff6c970000)
> bcryptPrimitives.dll => /c/WINDOWS/System32/bcryptPrimitives.dll (0x7fff6c4e0000)
> GDI32.dll => /c/WINDOWS/System32/GDI32.dll (0x7fff6e360000)
> gdi32full.dll => /c/WINDOWS/System32/gdi32full.dll (0x7fff6bbf0000)
> msvcp_win.dll => /c/WINDOWS/System32/msvcp_win.dll (0x7fff6c8d0000)
> USER32.dll => /c/WINDOWS/System32/USER32.dll (0x7fff6dcb0000)
> win32u.dll => /c/WINDOWS/System32/win32u.dll (0x7fff6ca70000)
> SHELL32.dll => /c/WINDOWS/System32/SHELL32.dll (0x7fff6e390000)
> cfgmgr32.dll => /c/WINDOWS/System32/cfgmgr32.dll (0x7fff6c560000)
> shcore.dll => /c/WINDOWS/System32/shcore.dll (0x7fff6db80000)
> libwinpthread-1.dll => /mingw64/bin/libwinpthread-1.dll (0x64940000)
> windows.storage.dll => /c/WINDOWS/System32/windows.storage.dll (0x7fff6bd90000)
> profapi.dll => /c/WINDOWS/System32/profapi.dll (0x7fff6bb40000)
> powrprof.dll => /c/WINDOWS/System32/powrprof.dll (0x7fff6bb70000)
> shlwapi.dll => /c/WINDOWS/System32/shlwapi.dll (0x7fff6d2a0000)
> kernel.appcore.dll => /c/WINDOWS/System32/kernel.appcore.dll (0x7fff6bbd0000)
> cryptsp.dll => /c/WINDOWS/System32/cryptsp.dll (0x7fff6c8b0000)
> VERSION.dll => /c/WINDOWS/SYSTEM32/VERSION.dll (0x7fff60a40000)
> libstdc++-6.dll => /mingw64/bin/libstdc++-6.dll (0x6fc40000)
> libgcc_s_seh-1.dll => /mingw64/bin/libgcc_s_seh-1.dll (0x61440000)
> libz3.dll => /c/msys64/mingw64/bin/libz3.dll (0xcf0000)
> libz3.dll => /c/msys64/mingw64/bin/libz3.dll (0xcf0000)
>
> - Tools -
>
> Compiler:
>
> $ clang++ --version
> clang version 10.0.0 (https://github.com/msys2/MINGW-packages.git
> 3f880aaba91a3d9cdfb222dc270274731a2119a9)
> Target: x86_64-w64-windows-gnu
> Thread model: posix
> InstalledDir: C:\msys64\mingw64\bin
>
> w/
>
> $ llvm-config --version
> 10.0.0
>
> Linker:
>
> $ /c/msys64/mingw64/bin/ld --version
> GNU ld (GNU Binutils) 2.34
> Copyright (C) 2020 Free Software Foundation, Inc.
> This program is free software; you may redistribute it under the terms of
> the GNU General Public License version 3 or (at your option) a later
> version.
> This program has absolutely no warranty.
>
> Make:
>
> $ mingw32-make --version
> GNU Make 4.3
> Built for Windows32
> Copyright (C) 1988-2020 Free Software Foundation, Inc.
> License GPLv3+: GNU GPL version 3 or later
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
More information about the cfe-dev
mailing list