mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-07-29 05:13:54 -06:00

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. Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Tested-by: Stefan Weil <sw@weilnetz.de> Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-Id: <20250110203401.178532-4-pierrick.bouvier@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20250116160306.1709518-26-alex.bennee@linaro.org>
64 lines
2.5 KiB
Meson
64 lines
2.5 KiB
Meson
if not get_option('plugins')
|
|
subdir_done()
|
|
endif
|
|
|
|
qemu_plugin_symbols = configure_file(
|
|
input: files('../include/qemu/qemu-plugin.h'),
|
|
output: 'qemu-plugin.symbols',
|
|
capture: true,
|
|
command: [files('../scripts/qemu-plugin-symbols.py'), '@INPUT@'])
|
|
|
|
# Modules need more symbols than just those in plugins/qemu-plugins.symbols
|
|
if not enable_modules
|
|
if host_os == 'darwin'
|
|
configure_file(
|
|
input: qemu_plugin_symbols,
|
|
output: 'qemu-plugins-ld64.symbols',
|
|
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'
|
|
# 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
|
|
win32_plugin_def = configure_file(
|
|
input: qemu_plugin_symbols,
|
|
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_cmd
|
|
)
|
|
endif
|
|
specific_ss.add(files(
|
|
'loader.c',
|
|
'core.c',
|
|
'api.c',
|
|
))
|