From: "Philippe Mathieu-Daudé" <philmd@linaro.org>
To: Pierrick Bouvier <pierrick.bouvier@linaro.org>,
qemu-devel@nongnu.org, Akihiko Odaki <akihiko.odaki@daynix.com>,
Yonggang Luo <luoyonggang@gmail.com>
Cc: "Michael S. Tsirkin" <mst@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Mahmoud Mandour" <ma.mandourr@gmail.com>,
"Alexandre Iooss" <erdnaxe@crans.org>,
"Markus Armbruster" <armbru@redhat.com>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Stefano Garzarella" <sgarzare@redhat.com>
Subject: Re: [PATCH v3 3/3] plugins: enable linking with clang/lld
Date: Fri, 10 Jan 2025 09:03:21 +0100 [thread overview]
Message-ID: <c51d143c-1936-4661-af4a-21c3447579ec@linaro.org> (raw)
In-Reply-To: <20241128201510.869974-4-pierrick.bouvier@linaro.org>
+Akihiko & Yonggang for
https://lore.kernel.org/qemu-devel/20201006120900.1579-1-luoyonggang@gmail.com/
On 28/11/24 21:15, Pierrick Bouvier wrote:
> Windows uses a special mechanism to enable plugins to work (DLL delay
> loading). Option for lld is different than ld.
>
> MSYS2 clang based environment use lld by default, so restricting to this
> config on Windows is safe, and will avoid false bug reports.
>
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
> ---
> meson.build | 5 +++++
> contrib/plugins/meson.build | 2 +-
> plugins/meson.build | 24 ++++++++++++++++++++----
> tests/tcg/plugins/meson.build | 3 +--
> 4 files changed, 27 insertions(+), 7 deletions(-)
>
> diff --git a/meson.build b/meson.build
> index 97cefb7cdd7..f286fb4f4a0 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -354,6 +354,11 @@ elif host_os == 'sunos'
> qemu_common_flags += '-D__EXTENSIONS__'
> elif host_os == 'haiku'
> qemu_common_flags += ['-DB_USE_POSITIVE_POSIX_ERRORS', '-D_BSD_SOURCE', '-fPIC']
> +elif host_os == 'windows'
> + # plugins use delaylib, and clang needs to be used with lld to make it work.
> + if compiler.get_id() == 'clang' and compiler.get_linker_id() != 'ld.lld'
> + error('On windows, you need to use lld with clang - use msys2 clang64/clangarm64 env')
> + endif
> endif
>
> # Choose instruction set (currently x86-only)
> diff --git a/contrib/plugins/meson.build b/contrib/plugins/meson.build
> index 63a32c2b4f0..484b9a808c8 100644
> --- a/contrib/plugins/meson.build
> +++ b/contrib/plugins/meson.build
> @@ -12,7 +12,7 @@ if get_option('plugins')
> t += shared_module(i, files(i + '.c') + 'win32_linker.c',
> include_directories: '../../include/qemu',
> link_depends: [win32_qemu_plugin_api_lib],
> - link_args: ['-Lplugins', '-lqemu_plugin_api'],
> + link_args: win32_qemu_plugin_api_link_flags,
> dependencies: glib)
> else
> t += shared_module(i, files(i + '.c'),
> diff --git a/plugins/meson.build b/plugins/meson.build
> index 98542e926f8..d60be2a4d6d 100644
> --- a/plugins/meson.build
> +++ b/plugins/meson.build
> @@ -17,14 +17,15 @@ if not enable_modules
> capture: true,
> command: ['sed', '-ne', 's/^[[:space:]]*\\(qemu_.*\\);/_\\1/p', '@INPUT@'])
> emulator_link_args += ['-Wl,-exported_symbols_list,plugins/qemu-plugins-ld64.symbols']
> + elif host_os == 'windows' and meson.get_compiler('c').get_id() == 'clang'
> + # LLVM/lld does not support exporting specific symbols. However, it works
> + # out of the box with dllexport/dllimport attribute we set in the code.
> else
> emulator_link_args += ['-Xlinker', '--dynamic-list=' + qemu_plugin_symbols.full_path()]
> endif
> endif
>
> if host_os == 'windows'
> - dlltool = find_program('dlltool', required: true)
> -
> # Generate a .lib file for plugins to link against.
> # First, create a .def file listing all the symbols a plugin should expect to have
> # available in qemu
> @@ -33,12 +34,27 @@ if host_os == 'windows'
> output: 'qemu_plugin_api.def',
> capture: true,
> command: ['sed', '-e', '0,/^/s//EXPORTS/; s/[{};]//g', '@INPUT@'])
> +
> # then use dlltool to assemble a delaylib.
> + # The delaylib will have an "imaginary" name (qemu.exe), that is used by the
> + # linker file we add with plugins (win32_linker.c) to identify that we want
> + # to find missing symbols in current program.
> + win32_qemu_plugin_api_link_flags = ['-Lplugins', '-lqemu_plugin_api']
> + if meson.get_compiler('c').get_id() == 'clang'
> + # With LLVM/lld, delaylib is specified at link time (-delayload)
> + dlltool = find_program('llvm-dlltool', required: true)
> + dlltool_cmd = [dlltool, '-d', '@INPUT@', '-l', '@OUTPUT@', '-D', 'qemu.exe']
> + win32_qemu_plugin_api_link_flags += ['-Wl,-delayload=qemu.exe']
> + else
> + # With gcc/ld, delay lib is built with a specific delay parameter.
> + dlltool = find_program('dlltool', required: true)
> + dlltool_cmd = [dlltool, '--input-def', '@INPUT@',
> + '--output-delaylib', '@OUTPUT@', '--dllname', 'qemu.exe']
> + endif
> win32_qemu_plugin_api_lib = configure_file(
> input: win32_plugin_def,
> output: 'libqemu_plugin_api.a',
> - command: [dlltool, '--input-def', '@INPUT@',
> - '--output-delaylib', '@OUTPUT@', '--dllname', 'qemu.exe']
> + command: dlltool_cmd
> )
> endif
> specific_ss.add(files(
> diff --git a/tests/tcg/plugins/meson.build b/tests/tcg/plugins/meson.build
> index f847849b1b7..87a17d67bd4 100644
> --- a/tests/tcg/plugins/meson.build
> +++ b/tests/tcg/plugins/meson.build
> @@ -5,9 +5,8 @@ if get_option('plugins')
> t += shared_module(i, files(i + '.c') + '../../../contrib/plugins/win32_linker.c',
> include_directories: '../../../include/qemu',
> link_depends: [win32_qemu_plugin_api_lib],
> - link_args: ['-Lplugins', '-lqemu_plugin_api'],
> + link_args: win32_qemu_plugin_api_link_flags,
> dependencies: glib)
> -
> else
> t += shared_module(i, files(i + '.c'),
> include_directories: '../../../include/qemu',
next prev parent reply other threads:[~2025-01-10 8:03 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-11-28 20:15 [PATCH v3 0/3] Enable clang build on Windows Pierrick Bouvier
2024-11-28 20:15 ` [PATCH v3 1/3] win32: remove usage of attribute gcc_struct Pierrick Bouvier
2024-11-28 21:01 ` Richard Henderson
2024-11-28 20:15 ` [PATCH v3 2/3] docs/devel/style: add a section about bitfield, and disallow them for packed structures Pierrick Bouvier
2024-11-28 21:02 ` Richard Henderson
2024-12-09 20:33 ` Philippe Mathieu-Daudé
2024-12-09 22:15 ` Pierrick Bouvier
2024-12-10 7:52 ` Thomas Huth
2024-12-10 10:10 ` Philippe Mathieu-Daudé
2024-12-10 18:45 ` Pierrick Bouvier
2024-11-28 20:15 ` [PATCH v3 3/3] plugins: enable linking with clang/lld Pierrick Bouvier
2025-01-10 8:03 ` Philippe Mathieu-Daudé [this message]
2024-12-09 18:34 ` [PATCH v3 0/3] Enable clang build on Windows Pierrick Bouvier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=c51d143c-1936-4661-af4a-21c3447579ec@linaro.org \
--to=philmd@linaro.org \
--cc=akihiko.odaki@daynix.com \
--cc=alex.bennee@linaro.org \
--cc=armbru@redhat.com \
--cc=berrange@redhat.com \
--cc=erdnaxe@crans.org \
--cc=luoyonggang@gmail.com \
--cc=ma.mandourr@gmail.com \
--cc=marcandre.lureau@redhat.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=pierrick.bouvier@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=sgarzare@redhat.com \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).