From: Christian Borntraeger <borntraeger@de.ibm.com>
To: Paolo Bonzini <pbonzini@redhat.com>, qemu-devel@nongnu.org
Cc: Fam Zheng <famz@redhat.com>
Subject: Re: [Qemu-devel] [PULL 05/21] rules.mak: Fix DSO build by pulling in archive symbols
Date: Mon, 22 Sep 2014 15:42:14 +0200 [thread overview]
Message-ID: <54202736.80801@de.ibm.com> (raw)
In-Reply-To: <1410530338-17615-6-git-send-email-pbonzini@redhat.com>
On 09/12/2014 03:58 PM, Paolo Bonzini wrote:
> From: Fam Zheng <famz@redhat.com>
>
> This fixes an issue with module build system. block/iscsi.so is
> currently broken:
>
> $ ~/build/last/qemu-img
> Failed to open module: /home/fam/build/master/block-iscsi.so:
> undefined symbol: qmp_query_uuid
> qemu-img: Not enough arguments
> Try 'qemu-img --help' for more information
>
> To fix this, we should (at least) let qemu-img link qmp_query_uuid from
> libqemustub.a. (There are a few other symbols missing, as well.)
>
> This patch changes the linking rules to:
>
> 1) Build ".mo" with "ld -r -o $@ $^" for each ".so", and later build .so
> with it.
>
> 2) Always build all the .mo before linking the executables. This is
> achieved by adding those .mo files to the executables' "-y"
> variables.
>
> 3) When linking an executable, those .mo files in its "-y" variables are
> filtered out, and replaced by one or more -Wl,-u,$symbol flags. This
> is done in the added macro "process-archive-undefs".
>
> These "-Wl,-u,$symbol" flags will force ld to pull in the function
> definition from the archives when linking.
>
> Note that the .mo objects, that are actually meant to be linked in
> the executables, are already expanded in unnest-vars, before the
> linking command. So we are safe to simply filter out .mo for the
> purpose of pulling undefined symbols.
>
> process-archive-undefs works as this: For each ".mo", find all the
> undefined symbols in it, filter ones that are defined in the
> archives. For each of these symbols, generate a "-Wl,-u,$symbol" in
> the link command, and put them before archive names in the command
> line.
>
> Suggested-by: H.J. Lu <hjl.tools@gmail.com>
> Signed-off-by: Fam Zheng <famz@redhat.com>
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This patch breaks building the mo files in po/ for me:
make -C po install
make[1]: Entering directory `/home/dailybuild/builder/packages/BUILD/qemu-2.1.0/po'
LD -r tr.mo
/usr/bin/ld: no input file
Christian
> ---
> rules.mak | 43 ++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 40 insertions(+), 3 deletions(-)
>
> diff --git a/rules.mak b/rules.mak
> index ba2f4c1..1d73293 100644
> --- a/rules.mak
> +++ b/rules.mak
> @@ -22,6 +22,32 @@ QEMU_DGFLAGS += -MMD -MP -MT $@ -MF $(*D)/$(*F).d
> # Same as -I$(SRC_PATH) -I., but for the nested source/object directories
> QEMU_INCLUDES += -I$(<D) -I$(@D)
>
> +WL_U := -Wl,-u,
> +find-symbols = $(if $1, $(sort $(shell nm -P -g $1 | $2)))
> +defined-symbols = $(call find-symbols,$1,awk '$$2!="U"{print $$1}')
> +undefined-symbols = $(call find-symbols,$1,awk '$$2=="U"{print $$1}')
> +
> +# All the .mo objects in -m variables are also added into corresponding -y
> +# variable in unnest-vars, but filtered out here, when LINK is called.
> +#
> +# The .mo objects are supposed to be linked as a DSO, for module build. So here
> +# they are only used as a placeholders to generate those "archive undefined"
> +# symbol options (-Wl,-u,$symbol_name), which are the archive functions
> +# referenced by the code in the DSO.
> +#
> +# Also the presence in -y variables will also guarantee they are built before
> +# linking executables that will load them. So we can look up symbol reference
> +# in LINK.
> +#
> +# This is necessary because the exectuable itself may not use the function, in
> +# which case the function would not be linked in. Then the DSO loading will
> +# fail because of the missing symbol.
> +process-archive-undefs = $(filter-out %.a %.mo,$1) \
> + $(addprefix $(WL_U), \
> + $(filter $(call defined-symbols,$(filter %.a, $1)), \
> + $(call undefined-symbols,$(filter %.mo,$1)))) \
> + $(filter %.a,$1)
> +
> extract-libs = $(strip $(foreach o,$1,$($o-libs)))
> expand-objs = $(strip $(sort $(filter %.o,$1)) \
> $(foreach o,$(filter %.mo,$1),$($o-objs)) \
> @@ -38,7 +64,8 @@ LINKPROG = $(or $(CXX),$(CC))
>
> ifeq ($(LIBTOOL),)
> LINK = $(call quiet-command, $(LINKPROG) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
> - $1 $(version-obj-y) $(call extract-libs,$1) $(LIBS)," LINK $(TARGET_DIR)$@")
> + $(call process-archive-undefs, $1) \
> + $(version-obj-y) $(call extract-libs,$1) $(LIBS)," LINK $(TARGET_DIR)$@")
> else
> LIBTOOL += $(if $(V),,--quiet)
> %.lo: %.c
> @@ -50,7 +77,8 @@ LIBTOOL += $(if $(V),,--quiet)
>
> LINK = $(call quiet-command,\
> $(if $(filter %.lo %.la,$1),$(LIBTOOL) --mode=link --tag=CC \
> - )$(LINKPROG) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $1 \
> + )$(LINKPROG) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ \
> + $(call process-archive-undefs, $1)\
> $(if $(filter %.lo %.la,$1),$(version-lobj-y),$(version-obj-y)) \
> $(if $(filter %.lo %.la,$1),$(LIBTOOLFLAGS)) \
> $(call extract-libs,$(1:.lo=.o)) $(LIBS),$(if $(filter %.lo %.la,$1),"lt LINK ", " LINK ")"$(TARGET_DIR)$@")
> @@ -76,11 +104,17 @@ endif
>
> %$(DSOSUF): CFLAGS += -fPIC -DBUILD_DSO
> %$(DSOSUF): LDFLAGS += $(LDFLAGS_SHARED)
> -%$(DSOSUF):
> +%$(DSOSUF): %.mo
> $(call LINK,$^)
> @# Copy to build root so modules can be loaded when program started without install
> $(if $(findstring /,$@),$(call quiet-command,cp $@ $(subst /,-,$@), " CP $(subst /,-,$@)"))
>
> +
> +LD_REL := $(CC) -nostdlib -Wl,-r
> +
> +%.mo:
> + $(call quiet-command,$(LD_REL) -o $@ $^," LD -r $(TARGET_DIR)$@")
> +
> .PHONY: modules
> modules:
>
> @@ -306,6 +340,9 @@ define unnest-vars
> # For module build, build shared libraries during "make modules"
> # For non-module build, add -m to -y
> $(if $(CONFIG_MODULES),
> + $(foreach o,$($v),
> + $(eval $o: $($o-objs)))
> + $(eval $(patsubst %-m,%-y,$v) += $($v))
> $(eval modules: $($v:%.mo=%$(DSOSUF))),
> $(eval $(patsubst %-m,%-y,$v) += $(call expand-objs, $($v)))))
>
next prev parent reply other threads:[~2014-09-22 13:42 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-12 13:58 [Qemu-devel] [PULL 00/21] KVM, memory, build, migration changes for 2014-09-11 Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 01/21] kvm: do not abort if KVM_RUN fails Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 02/21] trace: Only link generated-tracers.o with "simple" backend Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 03/21] util: Move general qemu_getauxval to util/getauxval.c Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 04/21] util: Don't link host-utils.o if it's empty Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 05/21] rules.mak: Fix DSO build by pulling in archive symbols Paolo Bonzini
2014-09-22 13:42 ` Christian Borntraeger [this message]
2014-09-12 13:58 ` [Qemu-devel] [PULL 06/21] exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 07/21] memory: add parameter errp to memory_region_init_ram Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 08/21] memory: add parameter errp to memory_region_init_rom_device Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 09/21] hostmem-ram: don't exit qemu if size of memory-backend-ram is way too big Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 10/21] exec: report error when memory < hpagesize Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 11/21] exec: add parameter errp to gethugepagesize Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 12/21] vl: use QLIST_FOREACH_SAFE to visit change state handlers Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 13/21] apic_common: vapic_paddr synchronization fix Paolo Bonzini
2014-09-19 10:43 ` Pavel Dovgaluk
[not found] ` <30501.4520571151$1411123417@news.gmane.org>
2014-09-19 12:04 ` Paolo Bonzini
2014-09-19 12:50 ` Pavel Dovgaluk
2014-09-19 13:41 ` Paolo Bonzini
2014-09-22 8:21 ` Pavel Dovgaluk
[not found] ` <8379.85978364504$1411374220@news.gmane.org>
2014-09-22 9:16 ` Paolo Bonzini
2014-09-26 11:18 ` Pavel Dovgaluk
2014-09-26 11:18 ` Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 14/21] cpu: init vmstate for ticks and clock offset Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 15/21] fdc: adding vmstate for save/restore Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 16/21] parallel: " Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 17/21] serial: fixing " Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 18/21] piix: do not set irq while loading vmstate Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 19/21] mc146818rtc: add missed field to vmstate Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 20/21] pckbd: adding new fields " Paolo Bonzini
2014-09-12 13:58 ` [Qemu-devel] [PULL 21/21] gdbstub: init mon_chr through qemu_chr_alloc Paolo Bonzini
2014-09-15 15:42 ` [Qemu-devel] [PULL 00/21] KVM, memory, build, migration changes for 2014-09-11 Peter Maydell
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=54202736.80801@de.ibm.com \
--to=borntraeger@de.ibm.com \
--cc=famz@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).