Skip to content

Commit

Permalink
build: replace weak symbols with a static library
Browse files Browse the repository at this point in the history
Weak symbols were a nice idea, but they turned out not to be a good one.
Toolchain support is just too sparse, in particular llvm-gcc is totally
broken.

This patch uses a surprisingly low-tech approach: a static library.
Symbols in a static library are always overridden by symbols in an
object file.  Furthermore, if you place each function in a separate
source file, object files for unused functions will not be taken in.
This means that each function can use all the dependencies that it needs
(especially QAPI stuff such as error_setg).

Thus, all stubs are placed in separate object files and put together in
a static library.  The library then is linked to all programs.

Signed-off-by: Paolo Bonzini <[email protected]>
Tested-by: Peter Maydell <[email protected]>
Reviewed-by: Peter Maydell <[email protected]>
Tested-by: Stefan Weil <[email protected]>
Signed-off-by: Blue Swirl <[email protected]>
  • Loading branch information
bonzini authored and blueswirl committed Nov 18, 2012
1 parent 2c5c445 commit 3bc2f57
Show file tree
Hide file tree
Showing 18 changed files with 89 additions and 89 deletions.
16 changes: 11 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,12 @@ version.o: $(SRC_PATH)/version.rc config-host.h
$(call quiet-command,$(WINDRES) -I. -o $@ $<," RC $(TARGET_DIR)$@")

version-obj-$(CONFIG_WIN32) += version.o

######################################################################
# Build library with stubs

libqemustub.a: $(stub-obj-y)

######################################################################
# Support building shared library libcacard

Expand All @@ -183,13 +189,13 @@ tools-obj-y = $(oslib-obj-y) $(trace-obj-y) qemu-tool.o qemu-timer.o \
main-loop.o iohandler.o error.o
tools-obj-$(CONFIG_POSIX) += compatfd.o

qemu-img$(EXESUF): qemu-img.o $(tools-obj-y) $(block-obj-y)
qemu-nbd$(EXESUF): qemu-nbd.o $(tools-obj-y) $(block-obj-y)
qemu-io$(EXESUF): qemu-io.o cmd.o $(tools-obj-y) $(block-obj-y)
qemu-img$(EXESUF): qemu-img.o $(tools-obj-y) $(block-obj-y) libqemustub.a
qemu-nbd$(EXESUF): qemu-nbd.o $(tools-obj-y) $(block-obj-y) libqemustub.a
qemu-io$(EXESUF): qemu-io.o cmd.o $(tools-obj-y) $(block-obj-y) libqemustub.a

qemu-bridge-helper$(EXESUF): qemu-bridge-helper.o

vscclient$(EXESUF): $(libcacard-y) $(oslib-obj-y) $(trace-obj-y) libcacard/vscclient.o
vscclient$(EXESUF): $(libcacard-y) $(oslib-obj-y) $(trace-obj-y) libcacard/vscclient.o libqemustub.a
$(call quiet-command,$(CC) $(LDFLAGS) -o $@ $^ $(libcacard_libs) $(LIBS)," LINK $@")

fsdev/virtfs-proxy-helper$(EXESUF): fsdev/virtfs-proxy-helper.o fsdev/virtio-9p-marshal.o oslib-posix.o $(trace-obj-y)
Expand Down Expand Up @@ -232,7 +238,7 @@ $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/scripts/qapi-commands.py $(qapi-py)
QGALIB_GEN=$(addprefix qga/qapi-generated/, qga-qapi-types.h qga-qapi-visit.h qga-qmp-commands.h)
$(qga-obj-y) qemu-ga.o: $(QGALIB_GEN)

qemu-ga$(EXESUF): qemu-ga.o $(qga-obj-y) $(oslib-obj-y) $(trace-obj-y) $(qapi-obj-y) $(qobject-obj-y) $(version-obj-y)
qemu-ga$(EXESUF): qemu-ga.o $(qga-obj-y) $(oslib-obj-y) $(trace-obj-y) $(qapi-obj-y) $(qobject-obj-y) $(version-obj-y) libqemustub.a

QEMULIBS=libuser libdis libdis-user

Expand Down
5 changes: 5 additions & 0 deletions Makefile.objs
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
#######################################################################
# Stub library, linked in tools
stub-obj-y = stubs/

#######################################################################
# Target-independent parts used in system and user emulation
universal-obj-y =
Expand Down Expand Up @@ -239,6 +243,7 @@ vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
QEMU_CFLAGS+=$(GLIB_CFLAGS)

nested-vars += \
stub-obj-y \
qga-obj-y \
qom-obj-y \
qapi-obj-y \
Expand Down
4 changes: 2 additions & 2 deletions Makefile.target
Original file line number Diff line number Diff line change
Expand Up @@ -162,12 +162,12 @@ endif #CONFIG_LINUX_USER

ifdef QEMU_PROGW
# The linker builds a windows executable. Make also a console executable.
$(QEMU_PROGW): $(all-obj-y)
$(QEMU_PROGW): $(all-obj-y) ../libqemustub.a
$(call LINK,$^)
$(QEMU_PROG): $(QEMU_PROGW)
$(call quiet-command,$(OBJCOPY) --subsystem console $(QEMU_PROGW) $(QEMU_PROG)," GEN $(TARGET_DIR)$(QEMU_PROG)")
else
$(QEMU_PROG): $(all-obj-y)
$(QEMU_PROG): $(all-obj-y) ../libqemustub.a
$(call LINK,$^)
endif

Expand Down
11 changes: 0 additions & 11 deletions compiler.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,20 +50,9 @@
# define __printf__ __gnu_printf__
# endif
# endif
# if defined(__APPLE__)
# define QEMU_WEAK_ALIAS(newname, oldname) \
static typeof(oldname) weak_##newname __attribute__((unused, weakref(#oldname)))
# define QEMU_WEAK_REF(newname, oldname) (weak_##newname ? weak_##newname : oldname)
# else
# define QEMU_WEAK_ALIAS(newname, oldname) \
typeof(oldname) newname __attribute__((weak, alias (#oldname)))
# define QEMU_WEAK_REF(newname, oldname) newname
# endif
#else
#define GCC_ATTR /**/
#define GCC_FMT_ATTR(n, m)
#define QEMU_WEAK_ALIAS(newname, oldname) \
_Pragma("weak " #newname "=" #oldname)
#endif

#endif /* COMPILER_H */
32 changes: 0 additions & 32 deletions osdep.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,38 +54,6 @@ static bool fips_enabled = false;

static const char *qemu_version = QEMU_VERSION;

static int default_fdset_get_fd(int64_t fdset_id, int flags)
{
return -1;
}
QEMU_WEAK_ALIAS(monitor_fdset_get_fd, default_fdset_get_fd);
#define monitor_fdset_get_fd \
QEMU_WEAK_REF(monitor_fdset_get_fd, default_fdset_get_fd)

static int default_fdset_dup_fd_add(int64_t fdset_id, int dup_fd)
{
return -1;
}
QEMU_WEAK_ALIAS(monitor_fdset_dup_fd_add, default_fdset_dup_fd_add);
#define monitor_fdset_dup_fd_add \
QEMU_WEAK_REF(monitor_fdset_dup_fd_add, default_fdset_dup_fd_add)

static int default_fdset_dup_fd_remove(int dup_fd)
{
return -1;
}
QEMU_WEAK_ALIAS(monitor_fdset_dup_fd_remove, default_fdset_dup_fd_remove);
#define monitor_fdset_dup_fd_remove \
QEMU_WEAK_REF(monitor_fdset_dup_fd_remove, default_fdset_dup_fd_remove)

static int default_fdset_dup_fd_find(int dup_fd)
{
return -1;
}
QEMU_WEAK_ALIAS(monitor_fdset_dup_fd_find, default_fdset_dup_fd_find);
#define monitor_fdset_dup_fd_find \
QEMU_WEAK_REF(monitor_fdset_dup_fd_remove, default_fdset_dup_fd_find)

int socket_set_cork(int fd, int v)
{
#if defined(SOL_TCP) && defined(TCP_CORK)
Expand Down
7 changes: 0 additions & 7 deletions oslib-win32.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,13 +32,6 @@
#include "trace.h"
#include "qemu_socket.h"

static void default_qemu_fd_register(int fd)
{
}
QEMU_WEAK_ALIAS(qemu_fd_register, default_qemu_fd_register);
#define qemu_fd_register \
QEMU_WEAK_REF(qemu_fd_register, default_qemu_fd_register)

void *qemu_oom_check(void *ptr)
{
if (ptr == NULL) {
Expand Down
22 changes: 0 additions & 22 deletions qemu-sockets.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,28 +61,6 @@ static QemuOptsList dummy_opts = {
},
};

static int default_monitor_get_fd(Monitor *mon, const char *name, Error **errp)
{
error_setg(errp, "only QEMU supports file descriptor passing");
return -1;
}
QEMU_WEAK_ALIAS(monitor_get_fd, default_monitor_get_fd);
#define monitor_get_fd \
QEMU_WEAK_REF(monitor_get_fd, default_monitor_get_fd)

static int default_qemu_set_fd_handler2(int fd,
IOCanReadHandler *fd_read_poll,
IOHandler *fd_read,
IOHandler *fd_write,
void *opaque)

{
abort();
}
QEMU_WEAK_ALIAS(qemu_set_fd_handler2, default_qemu_set_fd_handler2);
#define qemu_set_fd_handler2 \
QEMU_WEAK_REF(qemu_set_fd_handler2, default_qemu_set_fd_handler2)

static int inet_getport(struct addrinfo *e)
{
struct sockaddr_in *i4;
Expand Down
9 changes: 0 additions & 9 deletions qmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -471,15 +471,6 @@ DevicePropertyInfoList *qmp_device_list_properties(const char *typename,
return prop_list;
}

static CpuDefinitionInfoList *default_arch_query_cpu_definitions(Error **errp)
{
error_set(errp, QERR_NOT_SUPPORTED);
return NULL;
}
QEMU_WEAK_ALIAS(arch_query_cpu_definitions, default_arch_query_cpu_definitions);
#define arch_query_cpu_definitions \
QEMU_WEAK_REF(arch_query_cpu_definitions, default_arch_query_cpu_definitions)

CpuDefinitionInfoList *qmp_query_cpu_definitions(Error **errp)
{
return arch_query_cpu_definitions(errp);
Expand Down
2 changes: 1 addition & 1 deletion rules.mak
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ endif
%.o: %.m
$(call quiet-command,$(OBJCC) $(QEMU_INCLUDES) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<," OBJC $(TARGET_DIR)$@")

LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(sort $(1)) $(LIBS)," LINK $(TARGET_DIR)$@")
LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(sort $(filter %.o, $1)) $(filter-out %.o, $1) $(LIBS)," LINK $(TARGET_DIR)$@")

%$(EXESUF): %.o
$(call LINK,$^)
Expand Down
8 changes: 8 additions & 0 deletions stubs/Makefile.objs
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
stub-obj-y += arch-query-cpu-def.o
stub-obj-y += fdset-add-fd.o
stub-obj-y += fdset-find-fd.o
stub-obj-y += fdset-get-fd.o
stub-obj-y += fdset-remove-fd.o
stub-obj-y += get-fd.o
stub-obj-y += set-fd-handler.o
stub-obj-$(CONFIG_WIN32) += fd-register.o
9 changes: 9 additions & 0 deletions stubs/arch-query-cpu-def.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
#include "qemu-common.h"
#include "arch_init.h"
#include "qerror.h"

CpuDefinitionInfoList *arch_query_cpu_definitions(Error **errp)
{
error_set(errp, QERR_NOT_SUPPORTED);
return NULL;
}
6 changes: 6 additions & 0 deletions stubs/fd-register.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
#include "qemu-common.h"
#include "main-loop.h"

void qemu_fd_register(int fd)
{
}
7 changes: 7 additions & 0 deletions stubs/fdset-add-fd.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "qemu-common.h"
#include "monitor.h"

int monitor_fdset_dup_fd_add(int64_t fdset_id, int dup_fd)
{
return -1;
}
7 changes: 7 additions & 0 deletions stubs/fdset-find-fd.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "qemu-common.h"
#include "monitor.h"

int monitor_fdset_dup_fd_find(int dup_fd)
{
return -1;
}
7 changes: 7 additions & 0 deletions stubs/fdset-get-fd.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "qemu-common.h"
#include "monitor.h"

int monitor_fdset_get_fd(int64_t fdset_id, int flags)
{
return -1;
}
7 changes: 7 additions & 0 deletions stubs/fdset-remove-fd.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#include "qemu-common.h"
#include "monitor.h"

int monitor_fdset_dup_fd_remove(int dupfd)
{
return -1;
}
8 changes: 8 additions & 0 deletions stubs/get-fd.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
#include "qemu-common.h"
#include "monitor.h"

int monitor_get_fd(Monitor *mon, const char *name, Error **errp)
{
error_setg(errp, "only QEMU supports file descriptor passing");
return -1;
}
11 changes: 11 additions & 0 deletions stubs/set-fd-handler.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
#include "qemu-common.h"
#include "main-loop.h"

int qemu_set_fd_handler2(int fd,
IOCanReadHandler *fd_read_poll,
IOHandler *fd_read,
IOHandler *fd_write,
void *opaque)
{
abort();
}

0 comments on commit 3bc2f57

Please sign in to comment.