From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Cleber Rosa" <crosa@redhat.com>, "John Snow" <jsnow@redhat.com>,
"Michael Roth" <michael.roth@amd.com>,
"Alexandre Iooss" <erdnaxe@crans.org>,
"Konstantin Kostiuk" <kkostiuk@redhat.com>,
"Stefano Garzarella" <sgarzare@redhat.com>,
"Thomas Huth" <thuth@redhat.com>,
"Daniel P. Berrangé" <berrange@redhat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Marc-André Lureau" <marcandre.lureau@redhat.com>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Michael S. Tsirkin" <mst@redhat.com>,
"Mahmoud Mandour" <ma.mandourr@gmail.com>,
"Pierrick Bouvier" <pierrick.bouvier@linaro.org>
Subject: [PATCH 08/12] plugins: enable linking with clang/lld
Date: Wed, 30 Oct 2024 21:04:22 -0700 [thread overview]
Message-ID: <20241031040426.772604-9-pierrick.bouvier@linaro.org> (raw)
In-Reply-To: <20241031040426.772604-1-pierrick.bouvier@linaro.org>
Windows uses a special mechanism to enable plugins to work (DLL delay
loading). Option for lld is different than ld.
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
---
meson.build | 4 ++++
contrib/plugins/meson.build | 2 +-
plugins/meson.build | 24 ++++++++++++++++++++----
tests/tcg/plugins/meson.build | 3 +--
4 files changed, 26 insertions(+), 7 deletions(-)
diff --git a/meson.build b/meson.build
index d0d5dbe1479..fe11570b147 100644
--- a/meson.build
+++ b/meson.build
@@ -334,6 +334,10 @@ elif host_os == 'windows'
# We use this compilation option instead of relying on gcc_struct attribute
# because clang does not support it (but supports the option).
qemu_common_flags += ['-mno-ms-bitfields']
+
+ 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 1cc039d29b2..51297582f93 100644
--- a/plugins/meson.build
+++ b/plugins/meson.build
@@ -11,14 +11,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=' + (meson.project_source_root() / 'plugins/qemu-plugins.symbols')]
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
@@ -27,12 +28,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',
--
2.39.5
next prev parent reply other threads:[~2024-10-31 4:05 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-31 4:04 [PATCH 00/12] Enable building plugins on Windows with Clang Pierrick Bouvier
2024-10-31 4:04 ` [PATCH 01/12] scripts: remove erroneous file that breaks git clone on Windows Pierrick Bouvier
2024-10-31 4:04 ` [PATCH 02/12] contrib/plugins/cflow: fix warning Pierrick Bouvier
2024-10-31 4:04 ` [PATCH 03/12] meson: build contrib/plugins with meson Pierrick Bouvier
2024-10-31 4:04 ` [PATCH 04/12] contrib/plugins: remove Makefile for contrib/plugins Pierrick Bouvier
2024-10-31 4:04 ` [PATCH 05/12] qga: fix -Wsometimes-uninitialized windows warning Pierrick Bouvier
2024-10-31 13:32 ` Konstantin Kostiuk
2024-11-04 13:43 ` Konstantin Kostiuk
2024-10-31 4:04 ` [PATCH 06/12] qga: fix missing static and prototypes windows warnings Pierrick Bouvier
2024-10-31 4:11 ` Philippe Mathieu-Daudé
2024-10-31 13:32 ` Konstantin Kostiuk
2024-11-04 13:43 ` Konstantin Kostiuk
2024-11-04 22:30 ` Pierrick Bouvier
2024-10-31 4:04 ` [PATCH 07/12] win32: use compiler option instead of attribute gcc_struct Pierrick Bouvier
2024-10-31 9:28 ` Daniel P. Berrangé
2024-10-31 10:44 ` Thomas Huth
2024-10-31 19:01 ` Pierrick Bouvier
2024-10-31 4:04 ` Pierrick Bouvier [this message]
2024-10-31 4:04 ` [PATCH 09/12] plugins: add missing export for qemu_plugin_num_vcpus Pierrick Bouvier
2024-10-31 4:14 ` Philippe Mathieu-Daudé
2024-10-31 4:04 ` [PATCH 10/12] plugins: detect qemu plugin API symbols from header Pierrick Bouvier
2024-10-31 4:04 ` [PATCH 11/12] plugins: eradicate qemu-plugins.symbols static file Pierrick Bouvier
2024-10-31 4:04 ` [PATCH 12/12] docs: add information on how to setup build environments Pierrick Bouvier
2024-10-31 9:24 ` Daniel P. Berrangé
2024-10-31 19:38 ` Pierrick Bouvier
2024-11-04 15:58 ` Peter Maydell
2024-11-04 16:08 ` Michael S. Tsirkin
2024-11-04 22:09 ` Pierrick Bouvier
2024-11-04 22:05 ` Pierrick Bouvier
2024-11-05 10:15 ` Peter Maydell
2024-11-06 17:13 ` [PATCH 00/12] Enable building plugins on Windows with Clang 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=20241031040426.772604-9-pierrick.bouvier@linaro.org \
--to=pierrick.bouvier@linaro.org \
--cc=alex.bennee@linaro.org \
--cc=berrange@redhat.com \
--cc=crosa@redhat.com \
--cc=erdnaxe@crans.org \
--cc=jsnow@redhat.com \
--cc=kkostiuk@redhat.com \
--cc=ma.mandourr@gmail.com \
--cc=marcandre.lureau@redhat.com \
--cc=michael.roth@amd.com \
--cc=mst@redhat.com \
--cc=pbonzini@redhat.com \
--cc=philmd@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).