meson: Drop the .fa library suffix

The non-standard .fa library suffix breaks the link source
de-duplication done by Meson so drop it.

The lack of link source de-duplication causes AddressSanitizer to
complain ODR violations, and makes GNU ld abort when combined with
clang's LTO.

Fortunately, the non-standard suffix is not necessary anymore for
two reasons.

First, the non-standard suffix was necessary for fork-fuzzing.
Meson wraps all standard-suffixed libraries with --start-group and
--end-group. This made a fork-fuzz.ld linker script wrapped as well and
broke builds. Commit d2e6f9272d ("fuzz: remove fork-fuzzing
scaffolding") dropped fork-fuzzing so we can now restore the standard
suffix.

Second, the libraries are not even built anymore, because it is
possible to just use the object files directly via extract_all_objects().

The occurences of the suffix were detected and removed by performing
a tree-wide search with 'fa' and .fa (note the quotes and dot).

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Message-ID: <20240524-xkb-v4-4-2de564e5c859@daynix.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2024-05-24 10:56:55 +02:00
parent 7b1070a7e1
commit 4408155ac5
9 changed files with 4 additions and 31 deletions

View File

@ -45,10 +45,8 @@
exclude: exclude:
- build/**/*.p - build/**/*.p
- build/**/*.a.p - build/**/*.a.p
- build/**/*.fa.p
- build/**/*.c.o - build/**/*.c.o
- build/**/*.c.o.d - build/**/*.c.o.d
- build/**/*.fa
.common_test_job_template: .common_test_job_template:
extends: .base_job_template extends: .base_job_template

View File

@ -178,10 +178,8 @@ build-previous-qemu:
exclude: exclude:
- build-previous/**/*.p - build-previous/**/*.p
- build-previous/**/*.a.p - build-previous/**/*.a.p
- build-previous/**/*.fa.p
- build-previous/**/*.c.o - build-previous/**/*.c.o
- build-previous/**/*.c.o.d - build-previous/**/*.c.o.d
- build-previous/**/*.fa
needs: needs:
job: amd64-opensuse-leap-container job: amd64-opensuse-leap-container
variables: variables:

View File

@ -235,16 +235,11 @@ Subsystem sourcesets:
are then turned into static libraries as follows:: are then turned into static libraries as follows::
libchardev = static_library('chardev', chardev_ss.sources(), libchardev = static_library('chardev', chardev_ss.sources(),
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false), chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive: false),
dependencies: chardev_ss.dependencies()) dependencies: chardev_ss.dependencies())
As of Meson 0.55.1, the special ``.fa`` suffix should be used for everything
that is used with ``link_whole``, to ensure that the link flags are placed
correctly in the command line.
Target-independent emulator sourcesets: Target-independent emulator sourcesets:
Various general purpose helper code is compiled only once and Various general purpose helper code is compiled only once and
the .o files are linked into all output binaries that need it. the .o files are linked into all output binaries that need it.

View File

@ -19,13 +19,11 @@ gdb_system_ss = gdb_system_ss.apply({})
libgdb_user = static_library('gdb_user', libgdb_user = static_library('gdb_user',
gdb_user_ss.sources() + genh, gdb_user_ss.sources() + genh,
name_suffix: 'fa',
c_args: '-DCONFIG_USER_ONLY', c_args: '-DCONFIG_USER_ONLY',
build_by_default: false) build_by_default: false)
libgdb_system = static_library('gdb_system', libgdb_system = static_library('gdb_system',
gdb_system_ss.sources() + genh, gdb_system_ss.sources() + genh,
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
gdb_user = declare_dependency(objects: libgdb_user.extract_all_objects(recursive: false)) gdb_user = declare_dependency(objects: libgdb_user.extract_all_objects(recursive: false))

View File

@ -3467,7 +3467,6 @@ endif
qom_ss = qom_ss.apply({}) qom_ss = qom_ss.apply({})
libqom = static_library('qom', qom_ss.sources() + genh, libqom = static_library('qom', qom_ss.sources() + genh,
dependencies: [qom_ss.dependencies()], dependencies: [qom_ss.dependencies()],
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false), qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false),
dependencies: qom_ss.dependencies()) dependencies: qom_ss.dependencies())
@ -3475,7 +3474,6 @@ qom = declare_dependency(objects: libqom.extract_all_objects(recursive: false),
event_loop_base = files('event-loop-base.c') event_loop_base = files('event-loop-base.c')
event_loop_base = static_library('event-loop-base', event_loop_base = static_library('event-loop-base',
sources: event_loop_base + genh, sources: event_loop_base + genh,
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
event_loop_base = declare_dependency(objects: event_loop_base.extract_all_objects(recursive: false), event_loop_base = declare_dependency(objects: event_loop_base.extract_all_objects(recursive: false),
dependencies: [qom]) dependencies: [qom])
@ -3728,7 +3726,6 @@ qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
authz_ss = authz_ss.apply({}) authz_ss = authz_ss.apply({})
libauthz = static_library('authz', authz_ss.sources() + genh, libauthz = static_library('authz', authz_ss.sources() + genh,
dependencies: [authz_ss.dependencies()], dependencies: [authz_ss.dependencies()],
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: false), authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: false),
@ -3737,7 +3734,6 @@ authz = declare_dependency(objects: libauthz.extract_all_objects(recursive: fals
crypto_ss = crypto_ss.apply({}) crypto_ss = crypto_ss.apply({})
libcrypto = static_library('crypto', crypto_ss.sources() + genh, libcrypto = static_library('crypto', crypto_ss.sources() + genh,
dependencies: [crypto_ss.dependencies()], dependencies: [crypto_ss.dependencies()],
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
crypto = declare_dependency(objects: libcrypto.extract_all_objects(recursive: false), crypto = declare_dependency(objects: libcrypto.extract_all_objects(recursive: false),
@ -3747,14 +3743,12 @@ io_ss = io_ss.apply({})
libio = static_library('io', io_ss.sources() + genh, libio = static_library('io', io_ss.sources() + genh,
dependencies: [io_ss.dependencies()], dependencies: [io_ss.dependencies()],
link_with: libqemuutil, link_with: libqemuutil,
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
io = declare_dependency(objects: libio.extract_all_objects(recursive: false), io = declare_dependency(objects: libio.extract_all_objects(recursive: false),
dependencies: [io_ss.dependencies(), crypto, qom]) dependencies: [io_ss.dependencies(), crypto, qom])
libmigration = static_library('migration', sources: migration_files + genh, libmigration = static_library('migration', sources: migration_files + genh,
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false), migration = declare_dependency(objects: libmigration.extract_all_objects(recursive: false),
dependencies: [qom, io]) dependencies: [qom, io])
@ -3763,7 +3757,6 @@ system_ss.add(migration)
block_ss = block_ss.apply({}) block_ss = block_ss.apply({})
libblock = static_library('block', block_ss.sources() + genh, libblock = static_library('block', block_ss.sources() + genh,
dependencies: block_ss.dependencies(), dependencies: block_ss.dependencies(),
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
block = declare_dependency(objects: libblock.extract_all_objects(recursive: false), block = declare_dependency(objects: libblock.extract_all_objects(recursive: false),
@ -3772,7 +3765,6 @@ block = declare_dependency(objects: libblock.extract_all_objects(recursive: fals
blockdev_ss = blockdev_ss.apply({}) blockdev_ss = blockdev_ss.apply({})
libblockdev = static_library('blockdev', blockdev_ss.sources() + genh, libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
dependencies: blockdev_ss.dependencies(), dependencies: blockdev_ss.dependencies(),
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive: false), blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive: false),
@ -3781,14 +3773,12 @@ blockdev = declare_dependency(objects: libblockdev.extract_all_objects(recursive
qmp_ss = qmp_ss.apply({}) qmp_ss = qmp_ss.apply({})
libqmp = static_library('qmp', qmp_ss.sources() + genh, libqmp = static_library('qmp', qmp_ss.sources() + genh,
dependencies: qmp_ss.dependencies(), dependencies: qmp_ss.dependencies(),
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
qmp = declare_dependency(objects: libqmp.extract_all_objects(recursive: false), qmp = declare_dependency(objects: libqmp.extract_all_objects(recursive: false),
dependencies: qmp_ss.dependencies()) dependencies: qmp_ss.dependencies())
libchardev = static_library('chardev', chardev_ss.sources() + genh, libchardev = static_library('chardev', chardev_ss.sources() + genh,
name_suffix: 'fa',
dependencies: chardev_ss.dependencies(), dependencies: chardev_ss.dependencies(),
build_by_default: false) build_by_default: false)
@ -3797,7 +3787,6 @@ chardev = declare_dependency(objects: libchardev.extract_all_objects(recursive:
hwcore_ss = hwcore_ss.apply({}) hwcore_ss = hwcore_ss.apply({})
libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh, libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false)) hwcore = declare_dependency(objects: libhwcore.extract_all_objects(recursive: false))
common_ss.add(hwcore) common_ss.add(hwcore)
@ -3820,8 +3809,7 @@ common_all = static_library('common',
sources: common_ss.all_sources() + genh, sources: common_ss.all_sources() + genh,
include_directories: common_user_inc, include_directories: common_user_inc,
implicit_include_directories: false, implicit_include_directories: false,
dependencies: common_ss.all_dependencies(), dependencies: common_ss.all_dependencies())
name_suffix: 'fa')
feature_to_c = find_program('scripts/feature_to_c.py') feature_to_c = find_program('scripts/feature_to_c.py')
@ -3930,8 +3918,7 @@ foreach target : target_dirs
objects: objects, objects: objects,
include_directories: target_inc, include_directories: target_inc,
c_args: c_args, c_args: c_args,
build_by_default: false, build_by_default: false)
name_suffix: 'fa')
if target.endswith('-softmmu') if target.endswith('-softmmu')
execs = [{ execs = [{

View File

@ -1,7 +1,7 @@
#include "qemu/osdep.h" #include "qemu/osdep.h"
#include "block/export.h" #include "block/export.h"
/* Only used in programs that support block exports (libblockdev.fa) */ /* Only used in programs that support block exports (libblockdev.a) */
void blk_exp_close_all(void) void blk_exp_close_all(void)
{ {
} }

View File

@ -31,7 +31,6 @@ tcg_ss = tcg_ss.apply({})
libtcg_user = static_library('tcg_user', libtcg_user = static_library('tcg_user',
tcg_ss.sources() + genh, tcg_ss.sources() + genh,
name_suffix: 'fa',
dependencies: tcg_ss.dependencies(), dependencies: tcg_ss.dependencies(),
c_args: '-DCONFIG_USER_ONLY', c_args: '-DCONFIG_USER_ONLY',
build_by_default: false) build_by_default: false)
@ -42,7 +41,6 @@ user_ss.add(tcg_user)
libtcg_system = static_library('tcg_system', libtcg_system = static_library('tcg_system',
tcg_ss.sources() + genh, tcg_ss.sources() + genh,
name_suffix: 'fa',
dependencies: tcg_ss.dependencies(), dependencies: tcg_ss.dependencies(),
c_args: '-DCONFIG_SOFTMMU', c_args: '-DCONFIG_SOFTMMU',
build_by_default: false) build_by_default: false)

View File

@ -87,7 +87,7 @@ distclean-tcg: $(DISTCLEAN_TCG_TARGET_RULES)
.PHONY: check-venv check-avocado check-acceptance check-acceptance-deprecated-warning .PHONY: check-venv check-avocado check-acceptance check-acceptance-deprecated-warning
# Build up our target list from the filtered list of ninja targets # Build up our target list from the filtered list of ninja targets
TARGETS=$(patsubst libqemu-%.fa, %, $(filter libqemu-%.fa, $(ninja-targets))) TARGETS=$(patsubst libqemu-%.a, %, $(filter libqemu-%.a, $(ninja-targets)))
TESTS_VENV_TOKEN=$(BUILD_DIR)/pyvenv/tests.group TESTS_VENV_TOKEN=$(BUILD_DIR)/pyvenv/tests.group
TESTS_RESULTS_DIR=$(BUILD_DIR)/tests/results TESTS_RESULTS_DIR=$(BUILD_DIR)/tests/results

View File

@ -69,7 +69,6 @@ if have_virtfs
endif endif
libqos = static_library('qos', libqos_srcs + genh, libqos = static_library('qos', libqos_srcs + genh,
name_suffix: 'fa',
build_by_default: false) build_by_default: false)
qos = declare_dependency(objects: libqos.extract_all_objects(recursive: false)) qos = declare_dependency(objects: libqos.extract_all_objects(recursive: false))