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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.