Patchwork [v2] Drop --whole-archive and static libraries

login
register
mail settings
Submitter Andreas Färber
Date Dec. 31, 2009, 2:04 p.m.
Message ID <1262268274-1043-1-git-send-email-andreas.faerber@web.de>
Download mbox | patch
Permalink /patch/41966/
State New
Headers show

Comments

Andreas Färber - Dec. 31, 2009, 2:04 p.m.
From: Andreas Färber <afaerber@opensolaris.org>

Juan has contributed a cool Makefile infrastructure that enables us to drop
static libraries completely:

Move shared obj-y definitions to Makefile.objs, prefixed {common-,hw-,user-},
and link those object files directly into the executables.

Replace HWLIB by HWDIR, specifying only the directory.

Drop --whole-archive and ARLIBS in Makefiles and configure.

Drop GENERATED_HEADERS dependency in rules.mak, since this rebuilds all
common objects after generating a target-specific header; add dependency
rules to Makefile and Makefile.target instead.

v2:
- Don't try to include /config.mak for user emulators
- Changes to user object paths ("Quickfix for libuser.a drop") were obsoleted
  by "user_only: compile everything with -fpie" (Kirill A. Shutemov)

Signed-off-by: Andreas Färber <afaerber@opensolaris.org>
Cc: Palle Lyckegaard <palle@lyckegaard.dk>
Cc: Ben Taylor <bentaylor.solx86@gmail.com>
Cc: Juan Quintela <quintela@trasno.org>
Cc: Kirill A. Shutemov <kirill@shutemov.name>
Cc: Paolo Bonzini <pbonzini@redhat.com>
---
 Makefile        |  123 ++------------------------------------------
 Makefile.hw     |   33 +-----------
 Makefile.objs   |  155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 Makefile.target |   32 +++++++++---
 Makefile.user   |    9 +---
 configure       |   34 +------------
 rules.mak       |    4 +-
 7 files changed, 191 insertions(+), 199 deletions(-)
 create mode 100644 Makefile.objs
Blue Swirl - Jan. 3, 2010, 12:31 p.m.
2009/12/31 Andreas Färber <andreas.faerber@web.de>:
> From: Andreas Färber <afaerber@opensolaris.org>
>
> Juan has contributed a cool Makefile infrastructure that enables us to drop
> static libraries completely:
>
> Move shared obj-y definitions to Makefile.objs, prefixed {common-,hw-,user-},
> and link those object files directly into the executables.
>
> Replace HWLIB by HWDIR, specifying only the directory.
>
> Drop --whole-archive and ARLIBS in Makefiles and configure.
>
> Drop GENERATED_HEADERS dependency in rules.mak, since this rebuilds all
> common objects after generating a target-specific header; add dependency
> rules to Makefile and Makefile.target instead.
>
> v2:
> - Don't try to include /config.mak for user emulators
> - Changes to user object paths ("Quickfix for libuser.a drop") were obsoleted
>  by "user_only: compile everything with -fpie" (Kirill A. Shutemov)

Breaks build:
  CC    i386-softmmu/i386-dis.o
make[1]: *** No rule to make target `/loader.o', needed by `qemu'.  Stop.
Palle Lyckegaard - Jan. 3, 2010, 2:54 p.m.
On Thu, 31 Dec 2009, Andreas F?rber wrote:

> v2:
> - Don't try to include /config.mak for user emulators
> - Changes to user object paths ("Quickfix for libuser.a drop") were obsoleted
>  by "user_only: compile everything with -fpie" (Kirill A. Shutemov)
>


Hi,

I have succesfully used the v2 patch on my OpenSolaris/SPARC host and it 
seems to fix the Solaris linking issue.

/Palle
Blue Swirl - Jan. 4, 2010, 8:47 p.m.
On Sun, Jan 3, 2010 at 12:31 PM, Blue Swirl <blauwirbel@gmail.com> wrote:
> 2009/12/31 Andreas Färber <andreas.faerber@web.de>:
>> From: Andreas Färber <afaerber@opensolaris.org>
>>
>> Juan has contributed a cool Makefile infrastructure that enables us to drop
>> static libraries completely:
>>
>> Move shared obj-y definitions to Makefile.objs, prefixed {common-,hw-,user-},
>> and link those object files directly into the executables.
>>
>> Replace HWLIB by HWDIR, specifying only the directory.
>>
>> Drop --whole-archive and ARLIBS in Makefiles and configure.
>>
>> Drop GENERATED_HEADERS dependency in rules.mak, since this rebuilds all
>> common objects after generating a target-specific header; add dependency
>> rules to Makefile and Makefile.target instead.
>>
>> v2:
>> - Don't try to include /config.mak for user emulators
>> - Changes to user object paths ("Quickfix for libuser.a drop") were obsoleted
>>  by "user_only: compile everything with -fpie" (Kirill A. Shutemov)
>
> Breaks build:
>  CC    i386-softmmu/i386-dis.o
> make[1]: *** No rule to make target `/loader.o', needed by `qemu'.  Stop.

I found out that completely removing the object directory and
recreating it from scratch helps. This sucks bisectability-wise, is
there any way to avoid it?

There is still one problem, tools need config-host.h but the
dependencies are not correct:
  CC    qemu-nbd.o
In file included from /src/qemu/qemu-nbd.c:19:
/src/qemu/qemu-common.h:32:25: error: config-host.h: No such file or directory
Andreas Färber - Jan. 6, 2010, 6:51 p.m.
Am 04.01.2010 um 21:47 schrieb Blue Swirl:

> On Sun, Jan 3, 2010 at 12:31 PM, Blue Swirl <blauwirbel@gmail.com>  
> wrote:
>> 2009/12/31 Andreas Färber <andreas.faerber@web.de>:
>>> From: Andreas Färber <afaerber@opensolaris.org>
>>>
>>> Juan has contributed a cool Makefile infrastructure that enables  
>>> us to drop
>>> static libraries completely:
>>>
>>> Move shared obj-y definitions to Makefile.objs, prefixed  
>>> {common-,hw-,user-},
>>> and link those object files directly into the executables.
>>>
>>> Replace HWLIB by HWDIR, specifying only the directory.
>>>
>>> Drop --whole-archive and ARLIBS in Makefiles and configure.
>>>
>>> Drop GENERATED_HEADERS dependency in rules.mak, since this  
>>> rebuilds all
>>> common objects after generating a target-specific header; add  
>>> dependency
>>> rules to Makefile and Makefile.target instead.
>>>
>>> v2:
>>> - Don't try to include /config.mak for user emulators
>>> - Changes to user object paths ("Quickfix for libuser.a drop")  
>>> were obsoleted
>>>  by "user_only: compile everything with -fpie" (Kirill A. Shutemov)
>>
>> Breaks build:
>>  CC    i386-softmmu/i386-dis.o
>> make[1]: *** No rule to make target `/loader.o', needed by `qemu'.   
>> Stop.
>
> I found out that completely removing the object directory and
> recreating it from scratch helps. This sucks bisectability-wise, is
> there any way to avoid it?

Sounds as if configure was not re-run and thus $(HWDIR) not set in  
config-target.mak. No idea why, more likely a general issue.
Do you have a way to reproduce? What about `make clean` or `make  
distclean`?

> There is still one problem, tools need config-host.h but the
> dependencies are not correct:
>  CC    qemu-nbd.o
> In file included from /src/qemu/qemu-nbd.c:19:
> /src/qemu/qemu-common.h:32:25: error: config-host.h: No such file or  
> directory

Fix coming up. Basically, $(GENERATED_HEADERS) were previously used on  
_all_ object files via rules.mak. That does not work when referencing  
objects from another Makefile, so the modelling needs to be done  
explicitly.

Andreas
Blue Swirl - Jan. 6, 2010, 7:24 p.m.
On Wed, Jan 6, 2010 at 6:51 PM, Andreas Färber <andreas.faerber@web.de> wrote:
>
> Am 04.01.2010 um 21:47 schrieb Blue Swirl:
>
>> On Sun, Jan 3, 2010 at 12:31 PM, Blue Swirl <blauwirbel@gmail.com> wrote:
>>>
>>> 2009/12/31 Andreas Färber <andreas.faerber@web.de>:
>>>>
>>>> From: Andreas Färber <afaerber@opensolaris.org>
>>>>
>>>> Juan has contributed a cool Makefile infrastructure that enables us to
>>>> drop
>>>> static libraries completely:
>>>>
>>>> Move shared obj-y definitions to Makefile.objs, prefixed
>>>> {common-,hw-,user-},
>>>> and link those object files directly into the executables.
>>>>
>>>> Replace HWLIB by HWDIR, specifying only the directory.
>>>>
>>>> Drop --whole-archive and ARLIBS in Makefiles and configure.
>>>>
>>>> Drop GENERATED_HEADERS dependency in rules.mak, since this rebuilds all
>>>> common objects after generating a target-specific header; add dependency
>>>> rules to Makefile and Makefile.target instead.
>>>>
>>>> v2:
>>>> - Don't try to include /config.mak for user emulators
>>>> - Changes to user object paths ("Quickfix for libuser.a drop") were
>>>> obsoleted
>>>>  by "user_only: compile everything with -fpie" (Kirill A. Shutemov)
>>>
>>> Breaks build:
>>>  CC    i386-softmmu/i386-dis.o
>>> make[1]: *** No rule to make target `/loader.o', needed by `qemu'.  Stop.
>>
>> I found out that completely removing the object directory and
>> recreating it from scratch helps. This sucks bisectability-wise, is
>> there any way to avoid it?
>
> Sounds as if configure was not re-run and thus $(HWDIR) not set in
> config-target.mak. No idea why, more likely a general issue.
> Do you have a way to reproduce? What about `make clean` or `make distclean`?

Strange, now that I try to reproduce it with a new directory,
everything works. Also my normal compile directory does not show the
problem anymore. Maybe there were some old files lying around.

>> There is still one problem, tools need config-host.h but the
>> dependencies are not correct:
>>  CC    qemu-nbd.o
>> In file included from /src/qemu/qemu-nbd.c:19:
>> /src/qemu/qemu-common.h:32:25: error: config-host.h: No such file or
>> directory
>
> Fix coming up. Basically, $(GENERATED_HEADERS) were previously used on _all_
> object files via rules.mak. That does not work when referencing objects from
> another Makefile, so the modelling needs to be done explicitly.

OK. Since there have been no objections, I'd like to apply this soon.
Andreas Färber - Jan. 6, 2010, 7:53 p.m.
Am 06.01.2010 um 20:24 schrieb Blue Swirl:

> On Wed, Jan 6, 2010 at 6:51 PM, Andreas Färber  
> <andreas.faerber@web.de> wrote:
>>
>> Am 04.01.2010 um 21:47 schrieb Blue Swirl:
>>
>>> On Sun, Jan 3, 2010 at 12:31 PM, Blue Swirl <blauwirbel@gmail.com>  
>>> wrote:
>>>>
>>>> 2009/12/31 Andreas Färber <andreas.faerber@web.de>:
>>>>>
>>>>> From: Andreas Färber <afaerber@opensolaris.org>
>>>>>
>>>>> Juan has contributed a cool Makefile infrastructure that enables  
>>>>> us to
>>>>> drop
>>>>> static libraries completely:
>>>>>
>>>>> Move shared obj-y definitions to Makefile.objs, prefixed
>>>>> {common-,hw-,user-},
>>>>> and link those object files directly into the executables.
>>>>>
>>>>> Replace HWLIB by HWDIR, specifying only the directory.
>>>>>
>>>>> Drop --whole-archive and ARLIBS in Makefiles and configure.
>>>>>
>>>>> Drop GENERATED_HEADERS dependency in rules.mak, since this  
>>>>> rebuilds all
>>>>> common objects after generating a target-specific header; add  
>>>>> dependency
>>>>> rules to Makefile and Makefile.target instead.
>>>>>
>>>>> v2:
>>>>> - Don't try to include /config.mak for user emulators
>>>>> - Changes to user object paths ("Quickfix for libuser.a drop")  
>>>>> were
>>>>> obsoleted
>>>>>  by "user_only: compile everything with -fpie" (Kirill A.  
>>>>> Shutemov)

>>> There is still one problem, tools need config-host.h but the
>>> dependencies are not correct:
>>>  CC    qemu-nbd.o
>>> In file included from /src/qemu/qemu-nbd.c:19:
>>> /src/qemu/qemu-common.h:32:25: error: config-host.h: No such file or
>>> directory
>>
>> Fix coming up. Basically, $(GENERATED_HEADERS) were previously used  
>> on _all_
>> object files via rules.mak. That does not work when referencing  
>> objects from
>> another Makefile, so the modelling needs to be done explicitly.
>
> OK. Since there have been no objections, I'd like to apply this soon.

That would be very much appreciated.

I have not tested bsd-user. Could you please check that on your BSD  
setup?

Thanks,

Andreas
Blue Swirl - Jan. 6, 2010, 8:40 p.m.
On Wed, Jan 6, 2010 at 7:53 PM, Andreas Färber <andreas.faerber@web.de> wrote:
>
> Am 06.01.2010 um 20:24 schrieb Blue Swirl:
>
>> On Wed, Jan 6, 2010 at 6:51 PM, Andreas Färber <andreas.faerber@web.de>
>> wrote:
>>>
>>> Am 04.01.2010 um 21:47 schrieb Blue Swirl:
>>>
>>>> On Sun, Jan 3, 2010 at 12:31 PM, Blue Swirl <blauwirbel@gmail.com>
>>>> wrote:
>>>>>
>>>>> 2009/12/31 Andreas Färber <andreas.faerber@web.de>:
>>>>>>
>>>>>> From: Andreas Färber <afaerber@opensolaris.org>
>>>>>>
>>>>>> Juan has contributed a cool Makefile infrastructure that enables us to
>>>>>> drop
>>>>>> static libraries completely:
>>>>>>
>>>>>> Move shared obj-y definitions to Makefile.objs, prefixed
>>>>>> {common-,hw-,user-},
>>>>>> and link those object files directly into the executables.
>>>>>>
>>>>>> Replace HWLIB by HWDIR, specifying only the directory.
>>>>>>
>>>>>> Drop --whole-archive and ARLIBS in Makefiles and configure.
>>>>>>
>>>>>> Drop GENERATED_HEADERS dependency in rules.mak, since this rebuilds
>>>>>> all
>>>>>> common objects after generating a target-specific header; add
>>>>>> dependency
>>>>>> rules to Makefile and Makefile.target instead.
>>>>>>
>>>>>> v2:
>>>>>> - Don't try to include /config.mak for user emulators
>>>>>> - Changes to user object paths ("Quickfix for libuser.a drop") were
>>>>>> obsoleted
>>>>>>  by "user_only: compile everything with -fpie" (Kirill A. Shutemov)
>
>>>> There is still one problem, tools need config-host.h but the
>>>> dependencies are not correct:
>>>>  CC    qemu-nbd.o
>>>> In file included from /src/qemu/qemu-nbd.c:19:
>>>> /src/qemu/qemu-common.h:32:25: error: config-host.h: No such file or
>>>> directory
>>>
>>> Fix coming up. Basically, $(GENERATED_HEADERS) were previously used on
>>> _all_
>>> object files via rules.mak. That does not work when referencing objects
>>> from
>>> another Makefile, so the modelling needs to be done explicitly.
>>
>> OK. Since there have been no objections, I'd like to apply this soon.
>
> That would be very much appreciated.
>
> I have not tested bsd-user. Could you please check that on your BSD setup?

Seems to work, as do Milax and mingw32.

Patch

diff --git a/Makefile b/Makefile
index c1fa08c..e38d24a 100644
--- a/Makefile
+++ b/Makefile
@@ -66,7 +66,10 @@  SUBDIR_RULES=$(patsubst %,subdir-%, $(TARGET_DIRS))
 subdir-%: $(GENERATED_HEADERS)
 	$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $* V="$(V)" TARGET_DIR="$*/" all,)
 
-$(filter %-softmmu,$(SUBDIR_RULES)): libqemu_common.a
+include $(SRC_PATH)/Makefile.objs
+
+$(common-obj-y): $(GENERATED_HEADERS)
+$(filter %-softmmu,$(SUBDIR_RULES)): $(common-obj-y)
 
 $(filter %-user,$(SUBDIR_RULES)): libuser.a
 
@@ -81,124 +84,8 @@  ALL_SUBDIRS=$(TARGET_DIRS) $(patsubst %,pc-bios/%, $(ROMS))
 
 recurse-all: $(SUBDIR_RULES) $(ROMSUBDIR_RULES)
 
-#######################################################################
-# QObject
-qobject-obj-y = qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o
-qobject-obj-y += qjson.o json-lexer.o json-streamer.o json-parser.o
-qobject-obj-y += qerror.o
-
-#######################################################################
-# block-obj-y is code used by both qemu system emulation and qemu-img
-
-block-obj-y = cutils.o cache-utils.o qemu-malloc.o qemu-option.o module.o
-block-obj-y += nbd.o block.o aio.o aes.o osdep.o
-block-obj-$(CONFIG_POSIX) += posix-aio-compat.o
-block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
-
-block-nested-y += cow.o qcow.o vdi.o vmdk.o cloop.o dmg.o bochs.o vpc.o vvfat.o
-block-nested-y += qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o
-block-nested-y += parallels.o nbd.o
-block-nested-$(CONFIG_WIN32) += raw-win32.o
-block-nested-$(CONFIG_POSIX) += raw-posix.o
-block-nested-$(CONFIG_CURL) += curl.o
-
-block-obj-y +=  $(addprefix block/, $(block-nested-y))
-
-net-obj-y = net.o
-net-nested-y = queue.o checksum.o util.o
-net-nested-y += socket.o
-net-nested-y += dump.o
-net-nested-$(CONFIG_POSIX) += tap.o
-net-nested-$(CONFIG_LINUX) += tap-linux.o
-net-nested-$(CONFIG_WIN32) += tap-win32.o
-net-nested-$(CONFIG_BSD) += tap-bsd.o
-net-nested-$(CONFIG_SOLARIS) += tap-solaris.o
-net-nested-$(CONFIG_AIX) += tap-aix.o
-net-nested-$(CONFIG_SLIRP) += slirp.o
-net-nested-$(CONFIG_VDE) += vde.o
-net-obj-y += $(addprefix net/, $(net-nested-y))
-
-######################################################################
-# libqemu_common.a: Target independent part of system emulation. The
-# long term path is to suppress *all* target specific code in case of
-# system emulation, i.e. a single QEMU executable should support all
-# CPUs and machines.
-
-obj-y = $(block-obj-y)
-obj-y += $(net-obj-y)
-obj-y += $(qobject-obj-y)
-obj-y += readline.o console.o
-
-obj-y += tcg-runtime.o host-utils.o
-obj-y += irq.o ioport.o
-obj-$(CONFIG_PTIMER) += ptimer.o
-obj-$(CONFIG_MAX7310) += max7310.o
-obj-$(CONFIG_WM8750) += wm8750.o
-obj-$(CONFIG_TWL92230) += twl92230.o
-obj-$(CONFIG_TSC2005) += tsc2005.o
-obj-$(CONFIG_LM832X) += lm832x.o
-obj-$(CONFIG_TMP105) += tmp105.o
-obj-$(CONFIG_STELLARIS_INPUT) += stellaris_input.o
-obj-$(CONFIG_SSD0303) += ssd0303.o
-obj-$(CONFIG_SSD0323) += ssd0323.o
-obj-$(CONFIG_ADS7846) += ads7846.o
-obj-$(CONFIG_MAX111X) += max111x.o
-obj-$(CONFIG_DS1338) += ds1338.o
-obj-y += i2c.o smbus.o smbus_eeprom.o
-obj-y += eeprom93xx.o
-obj-y += scsi-disk.o cdrom.o
-obj-y += scsi-generic.o scsi-bus.o
-obj-y += usb.o usb-hub.o usb-$(HOST_USB).o usb-hid.o usb-msd.o usb-wacom.o
-obj-y += usb-serial.o usb-net.o usb-bus.o
-obj-$(CONFIG_SSI) += ssi.o
-obj-$(CONFIG_SSI_SD) += ssi-sd.o
-obj-$(CONFIG_SD) += sd.o
-obj-y += bt.o bt-host.o bt-vhci.o bt-l2cap.o bt-sdp.o bt-hci.o bt-hid.o usb-bt.o
-obj-y += bt-hci-csr.o
-obj-y += buffered_file.o migration.o migration-tcp.o qemu-sockets.o
-obj-y += qemu-char.o aio.o savevm.o
-obj-y += msmouse.o ps2.o
-obj-y += qdev.o qdev-properties.o
-obj-y += qemu-config.o block-migration.o
-
-obj-$(CONFIG_BRLAPI) += baum.o
-obj-$(CONFIG_POSIX) += migration-exec.o migration-unix.o migration-fd.o
-
 audio/audio.o audio/fmodaudio.o: QEMU_CFLAGS += $(FMOD_CFLAGS)
 
-audio-obj-y = audio.o noaudio.o wavaudio.o mixeng.o
-audio-obj-$(CONFIG_SDL) += sdlaudio.o
-audio-obj-$(CONFIG_OSS) += ossaudio.o
-audio-obj-$(CONFIG_COREAUDIO) += coreaudio.o
-audio-obj-$(CONFIG_ALSA) += alsaaudio.o
-audio-obj-$(CONFIG_DSOUND) += dsoundaudio.o
-audio-obj-$(CONFIG_FMOD) += fmodaudio.o
-audio-obj-$(CONFIG_ESD) += esdaudio.o
-audio-obj-$(CONFIG_PA) += paaudio.o
-audio-obj-$(CONFIG_WINWAVE) += winwaveaudio.o
-audio-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o
-audio-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o
-audio-obj-y += wavcapture.o
-obj-y += $(addprefix audio/, $(audio-obj-y))
-
-obj-y += keymaps.o
-obj-$(CONFIG_SDL) += sdl.o sdl_zoom.o x_keymap.o
-obj-$(CONFIG_CURSES) += curses.o
-obj-y += vnc.o acl.o d3des.o
-obj-$(CONFIG_VNC_TLS) += vnc-tls.o vnc-auth-vencrypt.o
-obj-$(CONFIG_VNC_SASL) += vnc-auth-sasl.o
-obj-$(CONFIG_COCOA) += cocoa.o
-obj-$(CONFIG_IOTHREAD) += qemu-thread.o
-
-slirp-obj-y = cksum.o if.o ip_icmp.o ip_input.o ip_output.o
-slirp-obj-y += slirp.o mbuf.o misc.o sbuf.o socket.o tcp_input.o tcp_output.o
-slirp-obj-y += tcp_subr.o tcp_timer.o udp.o bootp.o tftp.o
-obj-$(CONFIG_SLIRP) += $(addprefix slirp/, $(slirp-obj-y))
-
-# xen backend driver support
-obj-$(CONFIG_XEN) += xen_backend.o xen_devconfig.o
-obj-$(CONFIG_XEN) += xen_console.o xenfb.o xen_disk.o xen_nic.o
-
 QEMU_CFLAGS+=$(CURL_CFLAGS)
 
 cocoa.o: cocoa.m
@@ -229,8 +116,6 @@  curses.o: curses.c keymaps.h curses_keys.h
 
 bt-host.o: QEMU_CFLAGS += $(BLUEZ_CFLAGS)
 
-libqemu_common.a: $(obj-y)
-
 ######################################################################
 
 qemu-img.o: qemu-img-cmds.h
diff --git a/Makefile.hw b/Makefile.hw
index bd252f5..ff87ae4 100644
--- a/Makefile.hw
+++ b/Makefile.hw
@@ -11,41 +11,12 @@  VPATH=$(SRC_PATH):$(SRC_PATH)/hw
 
 QEMU_CFLAGS+=-I.. -I$(SRC_PATH)/fpu
 
-obj-y =
-obj-y += loader.o
-obj-y += virtio.o
-obj-y += fw_cfg.o
-obj-y += watchdog.o
-obj-$(CONFIG_ECC) += ecc.o
-obj-$(CONFIG_NAND) += nand.o
+include $(SRC_PATH)/Makefile.objs
 
-obj-$(CONFIG_M48T59) += m48t59.o
-obj-$(CONFIG_ESCC) += escc.o
-
-# PCI watchdog devices
-obj-y += wdt_i6300esb.o
-
-obj-y += msix.o
-
-# PCI network cards
-obj-y += ne2000.o
-
-obj-$(CONFIG_SMC91C111) += smc91c111.o
-obj-$(CONFIG_LAN9118) += lan9118.o
-
-# SCSI layer
-obj-y += lsi53c895a.o
-obj-$(CONFIG_ESP) += esp.o
-
-obj-y += dma-helpers.o sysbus.o isa-bus.o
-obj-$(CONFIG_QDEV_ADDR) += qdev-addr.o
-
-all: $(HWLIB)
+all: $(hw-obj-y)
 # Dummy command so that make thinks it has done something
 	@true
 
-$(HWLIB): $(obj-y)
-
 clean:
 	rm -f *.o *.d *.a *~
 
diff --git a/Makefile.objs b/Makefile.objs
new file mode 100644
index 0000000..e8a44d7
--- /dev/null
+++ b/Makefile.objs
@@ -0,0 +1,155 @@ 
+#######################################################################
+# QObject
+qobject-obj-y = qint.o qstring.o qdict.o qlist.o qfloat.o qbool.o
+qobject-obj-y += qjson.o json-lexer.o json-streamer.o json-parser.o
+qobject-obj-y += qerror.o
+
+#######################################################################
+# block-obj-y is code used by both qemu system emulation and qemu-img
+
+block-obj-y = cutils.o cache-utils.o qemu-malloc.o qemu-option.o module.o
+block-obj-y += nbd.o block.o aio.o aes.o osdep.o
+block-obj-$(CONFIG_POSIX) += posix-aio-compat.o
+block-obj-$(CONFIG_LINUX_AIO) += linux-aio.o
+
+block-nested-y += cow.o qcow.o vdi.o vmdk.o cloop.o dmg.o bochs.o vpc.o vvfat.o
+block-nested-y += qcow2.o qcow2-refcount.o qcow2-cluster.o qcow2-snapshot.o
+block-nested-y += parallels.o nbd.o
+block-nested-$(CONFIG_WIN32) += raw-win32.o
+block-nested-$(CONFIG_POSIX) += raw-posix.o
+block-nested-$(CONFIG_CURL) += curl.o
+
+block-obj-y +=  $(addprefix block/, $(block-nested-y))
+
+net-obj-y = net.o
+net-nested-y = queue.o checksum.o util.o
+net-nested-y += socket.o
+net-nested-y += dump.o
+net-nested-$(CONFIG_POSIX) += tap.o
+net-nested-$(CONFIG_LINUX) += tap-linux.o
+net-nested-$(CONFIG_WIN32) += tap-win32.o
+net-nested-$(CONFIG_BSD) += tap-bsd.o
+net-nested-$(CONFIG_SOLARIS) += tap-solaris.o
+net-nested-$(CONFIG_AIX) += tap-aix.o
+net-nested-$(CONFIG_SLIRP) += slirp.o
+net-nested-$(CONFIG_VDE) += vde.o
+net-obj-y += $(addprefix net/, $(net-nested-y))
+
+######################################################################
+# libqemu_common.a: Target independent part of system emulation. The
+# long term path is to suppress *all* target specific code in case of
+# system emulation, i.e. a single QEMU executable should support all
+# CPUs and machines.
+
+common-obj-y = $(block-obj-y)
+common-obj-y += $(net-obj-y)
+common-obj-y += $(qobject-obj-y)
+common-obj-y += readline.o console.o
+
+common-obj-y += tcg-runtime.o host-utils.o
+common-obj-y += irq.o ioport.o
+common-obj-$(CONFIG_PTIMER) += ptimer.o
+common-obj-$(CONFIG_MAX7310) += max7310.o
+common-obj-$(CONFIG_WM8750) += wm8750.o
+common-obj-$(CONFIG_TWL92230) += twl92230.o
+common-obj-$(CONFIG_TSC2005) += tsc2005.o
+common-obj-$(CONFIG_LM832X) += lm832x.o
+common-obj-$(CONFIG_TMP105) += tmp105.o
+common-obj-$(CONFIG_STELLARIS_INPUT) += stellaris_input.o
+common-obj-$(CONFIG_SSD0303) += ssd0303.o
+common-obj-$(CONFIG_SSD0323) += ssd0323.o
+common-obj-$(CONFIG_ADS7846) += ads7846.o
+common-obj-$(CONFIG_MAX111X) += max111x.o
+common-obj-$(CONFIG_DS1338) += ds1338.o
+common-obj-y += i2c.o smbus.o smbus_eeprom.o
+common-obj-y += eeprom93xx.o
+common-obj-y += scsi-disk.o cdrom.o
+common-obj-y += scsi-generic.o scsi-bus.o
+common-obj-y += usb.o usb-hub.o usb-$(HOST_USB).o usb-hid.o usb-msd.o usb-wacom.o
+common-obj-y += usb-serial.o usb-net.o usb-bus.o
+common-obj-$(CONFIG_SSI) += ssi.o
+common-obj-$(CONFIG_SSI_SD) += ssi-sd.o
+common-obj-$(CONFIG_SD) += sd.o
+common-obj-y += bt.o bt-host.o bt-vhci.o bt-l2cap.o bt-sdp.o bt-hci.o bt-hid.o usb-bt.o
+common-obj-y += bt-hci-csr.o
+common-obj-y += buffered_file.o migration.o migration-tcp.o qemu-sockets.o
+common-obj-y += qemu-char.o savevm.o #aio.o
+common-obj-y += msmouse.o ps2.o
+common-obj-y += qdev.o qdev-properties.o
+common-obj-y += qemu-config.o block-migration.o
+
+common-obj-$(CONFIG_BRLAPI) += baum.o
+common-obj-$(CONFIG_POSIX) += migration-exec.o migration-unix.o migration-fd.o
+
+audio-obj-y = audio.o noaudio.o wavaudio.o mixeng.o
+audio-obj-$(CONFIG_SDL) += sdlaudio.o
+audio-obj-$(CONFIG_OSS) += ossaudio.o
+audio-obj-$(CONFIG_COREAUDIO) += coreaudio.o
+audio-obj-$(CONFIG_ALSA) += alsaaudio.o
+audio-obj-$(CONFIG_DSOUND) += dsoundaudio.o
+audio-obj-$(CONFIG_FMOD) += fmodaudio.o
+audio-obj-$(CONFIG_ESD) += esdaudio.o
+audio-obj-$(CONFIG_PA) += paaudio.o
+audio-obj-$(CONFIG_WINWAVE) += winwaveaudio.o
+audio-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o
+audio-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o
+audio-obj-y += wavcapture.o
+common-obj-y += $(addprefix audio/, $(audio-obj-y))
+
+common-obj-y += keymaps.o
+common-obj-$(CONFIG_SDL) += sdl.o sdl_zoom.o x_keymap.o
+common-obj-$(CONFIG_CURSES) += curses.o
+common-obj-y += vnc.o acl.o d3des.o
+common-obj-$(CONFIG_VNC_TLS) += vnc-tls.o vnc-auth-vencrypt.o
+common-obj-$(CONFIG_VNC_SASL) += vnc-auth-sasl.o
+common-obj-$(CONFIG_COCOA) += cocoa.o
+common-obj-$(CONFIG_IOTHREAD) += qemu-thread.o
+
+slirp-obj-y = cksum.o if.o ip_icmp.o ip_input.o ip_output.o
+slirp-obj-y += slirp.o mbuf.o misc.o sbuf.o socket.o tcp_input.o tcp_output.o
+slirp-obj-y += tcp_subr.o tcp_timer.o udp.o bootp.o tftp.o
+common-obj-$(CONFIG_SLIRP) += $(addprefix slirp/, $(slirp-obj-y))
+
+# xen backend driver support
+common-obj-$(CONFIG_XEN) += xen_backend.o xen_devconfig.o
+common-obj-$(CONFIG_XEN) += xen_console.o xenfb.o xen_disk.o xen_nic.o
+
+######################################################################
+# libuser
+
+user-obj-y =
+user-obj-y += envlist.o path.o
+user-obj-y += tcg-runtime.o host-utils.o
+user-obj-y += cutils.o cache-utils.o
+
+######################################################################
+# libhw
+
+hw-obj-y =
+hw-obj-y += loader.o
+hw-obj-y += virtio.o
+hw-obj-y += fw_cfg.o
+hw-obj-y += watchdog.o
+hw-obj-$(CONFIG_ECC) += ecc.o
+hw-obj-$(CONFIG_NAND) += nand.o
+
+hw-obj-$(CONFIG_M48T59) += m48t59.o
+hw-obj-$(CONFIG_ESCC) += escc.o
+
+# PCI watchdog devices
+hw-obj-y += wdt_i6300esb.o
+
+hw-obj-y += msix.o
+
+# PCI network cards
+hw-obj-y += ne2000.o
+
+hw-obj-$(CONFIG_SMC91C111) += smc91c111.o
+hw-obj-$(CONFIG_LAN9118) += lan9118.o
+
+# SCSI layer
+hw-obj-y += lsi53c895a.o
+hw-obj-$(CONFIG_ESP) += esp.o
+
+hw-obj-y += dma-helpers.o sysbus.o isa-bus.o
+hw-obj-$(CONFIG_QDEV_ADDR) += qdev-addr.o
diff --git a/Makefile.target b/Makefile.target
index 7c1f30c..d4bb4d6 100644
--- a/Makefile.target
+++ b/Makefile.target
@@ -7,11 +7,16 @@  include ../config-host.mak
 include config-devices.mak
 include config-target.mak
 include $(SRC_PATH)/rules.mak
+ifneq ($(HWDIR),)
+include $(HWDIR)/config.mak
+endif
 
 TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH)
 VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw
 QEMU_CFLAGS+= -I.. -I$(TARGET_PATH) -DNEED_CPU_H
 
+include $(SRC_PATH)/Makefile.objs
+
 ifdef CONFIG_USER_ONLY
 # user emulator name
 QEMU_PROG=qemu-$(TARGET_ARCH2)
@@ -64,9 +69,9 @@  libobj-$(CONFIG_S390_DIS) += s390-dis.o
 libobj-$(CONFIG_SH4_DIS) += sh4-dis.o
 libobj-$(CONFIG_SPARC_DIS) += sparc-dis.o
 
-# libqemu
+$(libobj-y): $(GENERATED_HEADERS)
 
-libqemu.a: $(libobj-y)
+# libqemu
 
 translate.o: translate.c cpu.h
 
@@ -106,7 +111,10 @@  obj-arm-y += arm-semi.o
 
 obj-m68k-y += m68k-sim.o m68k-semi.o
 
-ARLIBS=../libuser/libuser.a libqemu.a
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../libuser/, $(user-obj-y))
+obj-y += $(libobj-y)
 
 endif #CONFIG_LINUX_USER
 
@@ -128,7 +136,10 @@  obj-y = main.o commpage.o machload.o mmap.o signal.o syscall.o thunk.o \
 
 obj-i386-y += ioport-user.o
 
-ARLIBS=../libuser/libuser.a libqemu.a
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../libuser/, $(user-obj-y))
+obj-y += $(libobj-y)
 
 endif #CONFIG_DARWIN_USER
 
@@ -145,7 +156,10 @@  obj-y = main.o bsdload.o elfload.o mmap.o signal.o strace.o syscall.o \
 
 obj-i386-y += ioport-user.o
 
-ARLIBS=../libuser/libuser.a libqemu.a
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../libuser/, $(user-obj-y))
+obj-y += $(libobj-y)
 
 endif #CONFIG_BSD_USER
 
@@ -303,13 +317,17 @@  vl.o: qemu-options.h
 
 monitor.o: qemu-monitor.h
 
-ARLIBS=../libqemu_common.a libqemu.a $(HWLIB)
+$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y): $(GENERATED_HEADERS)
+
+obj-y += $(addprefix ../, $(common-obj-y))
+obj-y += $(libobj-y)
+obj-y += $(addprefix $(HWDIR)/, $(hw-obj-y))
 
 endif # CONFIG_SOFTMMU
 
 obj-$(CONFIG_GDBSTUB_XML) += gdbstub-xml.o
 
-$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y) $(ARLIBS)
+$(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y)
 	$(call LINK,$(obj-y) $(obj-$(TARGET_BASE_ARCH)-y))
 
 
diff --git a/Makefile.user b/Makefile.user
index 7daedef..c6ac509 100644
--- a/Makefile.user
+++ b/Makefile.user
@@ -14,17 +14,12 @@  vpath %.c %.h $(SRC_PATH)
 
 QEMU_CFLAGS+=-I..
 
-obj-y =
-obj-y += envlist.o path.o
-obj-y += tcg-runtime.o host-utils.o
-obj-y += cutils.o cache-utils.o
+include $(SRC_PATH)/Makefile.objs
 
-all: libuser.a
+all: $(user-obj-y)
 # Dummy command so that make thinks it has done something
 	@true
 
-libuser.a: $(obj-y)
-
 clean:
 	rm -f *.o *.d *.a *~
 
diff --git a/configure b/configure
index 18aed43..1e9dd04 100755
--- a/configure
+++ b/configure
@@ -1707,37 +1707,6 @@  elif compile_prog "" "-lrt" ; then
   LIBS="-lrt $LIBS"
 fi
 
-# Determine what linker flags to use to force archive inclusion
-check_linker_flags()
-{
-    w2=
-    if test "$2" ; then
-	w2=-Wl,$2
-    fi
-    compile_prog "" "-Wl,$1 ${w2}"
-}
-
-cat > $TMPC << EOF
-int main(void) { }
-EOF
-if check_linker_flags --whole-archive --no-whole-archive ; then
-    # GNU ld
-    arlibs_begin="-Wl,--whole-archive"
-    arlibs_end="-Wl,--no-whole-archive"
-elif check_linker_flags -z,allextract -z,defaultextract ; then
-    # Solaris ld
-    arlibs_begin="-Wl,-z,allextract"
-    arlibs_end="-Wl,-z,defaultextract"
-elif check_linker_flags -all_load ; then
-    # Mac OS X
-    arlibs_begin="-all_load"
-    arlibs_end=""
-else
-    echo "Error: your linker does not support --whole-archive or -z."
-    echo "Please report to qemu-devel@nongnu.org"
-    exit 1
-fi
-
 if test "$darwin" != "yes" -a "$mingw32" != "yes" -a "$solaris" != yes -a \
         "$aix" != "yes" ; then
     libs_softmmu="-lutil $libs_softmmu"
@@ -2427,7 +2396,7 @@  fi
 if test "$target_softmmu" = "yes" ; then
   echo "CONFIG_SOFTMMU=y" >> $config_target_mak
   echo "LIBS+=$libs_softmmu" >> $config_target_mak
-  echo "HWLIB=../libhw$target_phys_bits/libqemuhw$target_phys_bits.a" >> $config_target_mak
+  echo "HWDIR=../libhw$target_phys_bits" >> $config_target_mak
   echo "subdir-$target: subdir-libhw$target_phys_bits" >> $config_host_mak
 fi
 if test "$target_user_only" = "yes" ; then
@@ -2644,7 +2613,6 @@  for hwlib in 32 64; do
   mkdir -p $d
   rm -f $d/Makefile
   ln -s $source_path/Makefile.hw $d/Makefile
-  echo "HWLIB=libqemuhw$hwlib.a" > $d/config.mak
   echo "QEMU_CFLAGS+=-DTARGET_PHYS_ADDR_BITS=$hwlib" >> $d/config.mak
 done
 
diff --git a/rules.mak b/rules.mak
index 5d9f684..9bcf9af 100644
--- a/rules.mak
+++ b/rules.mak
@@ -14,7 +14,7 @@  MAKEFLAGS += -rR
 # Flags for dependency generation
 QEMU_DGFLAGS += -MMD -MP -MT $@
 
-%.o: %.c $(GENERATED_HEADERS)
+%.o: %.c
 	$(call quiet-command,$(CC) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  CC    $(TARGET_DIR)$@")
 
 %.o: %.S
@@ -23,7 +23,7 @@  QEMU_DGFLAGS += -MMD -MP -MT $@
 %.o: %.m
 	$(call quiet-command,$(CC) $(QEMU_CFLAGS) $(QEMU_DGFLAGS) $(CFLAGS) -c -o $@ $<,"  OBJC  $(TARGET_DIR)$@")
 
-LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(1) $(ARLIBS_BEGIN) $(ARLIBS) $(ARLIBS_END) $(LIBS),"  LINK  $(TARGET_DIR)$@")
+LINK = $(call quiet-command,$(CC) $(QEMU_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ $(1) $(LIBS),"  LINK  $(TARGET_DIR)$@")
 
 %$(EXESUF): %.o
 	$(call LINK,$^)