Skip to content

Commit

Permalink
plugins: enable linking with clang/lld
Browse files Browse the repository at this point in the history
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é <[email protected]>
Signed-off-by: Pierrick Bouvier <[email protected]>
Tested-by: Stefan Weil <[email protected]>
Tested-by: Philippe Mathieu-Daudé <[email protected]>
Message-Id: <[email protected]>
Signed-off-by: Alex Bennée <[email protected]>
Message-Id: <[email protected]>
  • Loading branch information
pbo-linaro authored and stsquad committed Jan 17, 2025
1 parent ecbf356 commit 923710b
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 7 deletions.
2 changes: 1 addition & 1 deletion contrib/plugins/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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'),
Expand Down
5 changes: 5 additions & 0 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -377,6 +377,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)
Expand Down
24 changes: 20 additions & 4 deletions plugins/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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(
Expand Down
3 changes: 1 addition & 2 deletions tests/tcg/plugins/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -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',
Expand Down

0 comments on commit 923710b

Please sign in to comment.