From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60378) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WImQ4-0003FG-Ke for qemu-devel@nongnu.org; Wed, 26 Feb 2014 16:53:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1WImQ1-0002nW-4c for qemu-devel@nongnu.org; Wed, 26 Feb 2014 16:53:36 -0500 Received: from mnementh.archaic.org.uk ([2001:8b0:1d0::1]:46279) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1WImQ0-0002nD-Td for qemu-devel@nongnu.org; Wed, 26 Feb 2014 16:53:33 -0500 From: Peter Maydell Date: Wed, 26 Feb 2014 21:53:30 +0000 Message-Id: <1393451610-24617-1-git-send-email-peter.maydell@linaro.org> Subject: [Qemu-devel] [PATCH] configure: Always build with -fno-common List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: =?UTF-8?q?Andreas=20F=C3=A4rber?= , Markus Armbruster , patches@linaro.org MacOSX doesn't pull .o files from .a archives if the symbol that it requires is one which the .o file defines as a common symbol. (Common symbols are those declared without "extern"; the linker will merge together common symbols with the same name, so redeclaring the same variable in two compilation units results in them referring to the same symbol rather than a compilation error). This MacOSX difference from traditional linker behaviour means that "make check" produces link errors: Undefined symbols for architecture x86_64: "_cur_mon", referenced from: _error_vprintf in libqemuutil.a(qemu-error.o) _error_printf in libqemuutil.a(qemu-error.o) _error_printf_unless_qmp in libqemuutil.a(qemu-error.o) _error_print_loc in libqemuutil.a(qemu-error.o) _error_report in libqemuutil.a(qemu-error.o) ld: symbol(s) not found for architecture x86_64 in this case because "cur_mon" is a common symbol in libqemustub.a(mon-set-error.o). In QEMU we don't make any use at all of the common symbol functionality, so we can avoid this problem entirely simply by compiling with -fno-common. Enable this option for all builds, not just MacOSX, so that if we ever inadvertently introduce multiple definitions of some variable that will be immediately spotted as a build error rather than only breaking the MacOSX build. Suggested-by: Markus Armbruster Signed-off-by: Peter Maydell --- Thanks to Markus for pointing out that -fno-common was the simple solution to this problem. make check now works on MacOSX, although due to a race condition in the version of glib I'm stuck on (2.22.4) I have to periodically use "killall -CHLD gtester" to unwedge it... configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index 423f435..ff438e4 100755 --- a/configure +++ b/configure @@ -369,7 +369,7 @@ sdl_config="${SDL_CONFIG-${cross_prefix}sdl-config}" ARFLAGS="${ARFLAGS-rv}" # default flags for all hosts -QEMU_CFLAGS="-fno-strict-aliasing $QEMU_CFLAGS" +QEMU_CFLAGS="-fno-strict-aliasing -fno-common $QEMU_CFLAGS" QEMU_CFLAGS="-Wall -Wundef -Wwrite-strings -Wmissing-prototypes $QEMU_CFLAGS" QEMU_CFLAGS="-Wstrict-prototypes -Wredundant-decls $QEMU_CFLAGS" QEMU_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE $QEMU_CFLAGS" -- 1.8.5.4