Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] uml: allow building as 32-bit binary on 64bit host

This patch makes the command:

make ARCH=um SUBARCH=i386

work on x86_64 hosts (with support for building 32-bit binaries). This is
especially needed since 64-bit UMLs don't support 32-bit emulation for guest
binaries, currently. This has been tested in all possible cases and works.

Only exception is that I've built but not tested a 64-bit binary, because I
hadn't a 64-bit filesystem available.

Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Cc: Jeff Dike <jdike@addtoit.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by

Paolo 'Blaisorblade' Giarrusso and committed by
Linus Torvalds
20d00213 ecc354a9

+31 -21
+4 -7
arch/um/Makefile
··· 51 51 endif 52 52 SYS_DIR := $(ARCH_DIR)/include/sysdep-$(SUBARCH) 53 53 54 - include $(srctree)/$(ARCH_DIR)/Makefile-$(SUBARCH) 55 - 56 - core-y += $(SUBARCH_CORE) 57 - libs-y += $(SUBARCH_LIBS) 58 - 59 54 # -Dvmap=kernel_vmap affects everything, and prevents anything from 60 55 # referencing the libpcap.o symbol so named. 61 56 ··· 59 64 60 65 USER_CFLAGS := $(patsubst -I%,,$(CFLAGS)) 61 66 USER_CFLAGS := $(patsubst -D__KERNEL__,,$(USER_CFLAGS)) $(ARCH_INCLUDE) \ 62 - $(MODE_INCLUDE) $(ARCH_USER_CFLAGS) 67 + $(MODE_INCLUDE) 63 68 64 69 # -Derrno=kernel_errno - This turns all kernel references to errno into 65 70 # kernel_errno to separate them from the libc errno. This allows -fno-common ··· 68 73 69 74 CFLAGS += -Derrno=kernel_errno -Dsigprocmask=kernel_sigprocmask 70 75 CFLAGS += $(call cc-option,-fno-unit-at-a-time,) 76 + 77 + include $(srctree)/$(ARCH_DIR)/Makefile-$(SUBARCH) 71 78 72 79 #This will adjust *FLAGS accordingly to the platform. 73 80 include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS) ··· 129 132 #The wrappers will select whether using "malloc" or the kernel allocator. 130 133 LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc 131 134 132 - CFLAGS_vmlinux = $(LINK-y) $(LINK_WRAPS) 135 + CFLAGS_vmlinux := $(LINK-y) $(LINK_WRAPS) 133 136 define cmd_vmlinux__ 134 137 $(CC) $(CFLAGS_vmlinux) -o $@ \ 135 138 -Wl,-T,$(vmlinux-lds) $(vmlinux-init) \
+21 -10
arch/um/Makefile-i386
··· 1 - SUBARCH_CORE := arch/um/sys-i386/ arch/i386/crypto/ 1 + core-y += arch/um/sys-i386/ arch/i386/crypto/ 2 2 3 3 TOP_ADDR := $(CONFIG_TOP_ADDR) 4 4 ··· 8 8 endif 9 9 endif 10 10 11 + LDFLAGS += -m elf_i386 12 + ELF_ARCH := $(SUBARCH) 13 + ELF_FORMAT := elf32-$(SUBARCH) 14 + OBJCOPYFLAGS := -O binary -R .note -R .comment -S 15 + 16 + ifeq ("$(origin SUBARCH)", "command line") 17 + ifneq ("$(shell uname -m | sed -e s/i.86/i386/)", "$(SUBARCH)") 18 + CFLAGS += $(call cc-option,-m32) 19 + USER_CFLAGS += $(call cc-option,-m32) 20 + HOSTCFLAGS += $(call cc-option,-m32) 21 + HOSTLDFLAGS += $(call cc-option,-m32) 22 + AFLAGS += $(call cc-option,-m32) 23 + LINK-y += $(call cc-option,-m32) 24 + UML_OBJCOPYFLAGS += -F $(ELF_FORMAT) 25 + 26 + export LDFLAGS HOSTCFLAGS HOSTLDFLAGS UML_OBJCOPYFLAGS 27 + endif 28 + endif 29 + 11 30 CFLAGS += -U__$(SUBARCH)__ -U$(SUBARCH) $(STUB_CFLAGS) 12 - ARCH_USER_CFLAGS := 13 31 14 32 ifneq ($(CONFIG_GPROF),y) 15 33 ARCH_CFLAGS += -DUM_FASTCALL 16 34 endif 17 35 18 - ELF_ARCH := $(SUBARCH) 19 - ELF_FORMAT := elf32-$(SUBARCH) 20 - 21 - OBJCOPYFLAGS := -O binary -R .note -R .comment -S 22 - 23 - SYS_UTIL_DIR := $(ARCH_DIR)/sys-i386/util 24 - 25 - SYS_HEADERS := $(SYS_DIR)/sc.h $(SYS_DIR)/thread.h 36 + SYS_HEADERS := $(SYS_DIR)/sc.h $(SYS_DIR)/thread.h 26 37 27 38 prepare: $(SYS_HEADERS) 28 39
+4 -2
arch/um/Makefile-x86_64
··· 1 1 # Copyright 2003 - 2004 Pathscale, Inc 2 2 # Released under the GPL 3 3 4 - SUBARCH_LIBS := arch/um/sys-x86_64/ 4 + libs-y += arch/um/sys-x86_64/ 5 5 START := 0x60000000 6 6 7 + #We #undef __x86_64__ for kernelspace, not for userspace where 8 + #it's needed for headers to work! 7 9 CFLAGS += -U__$(SUBARCH)__ -fno-builtin $(STUB_CFLAGS) 8 - ARCH_USER_CFLAGS := -D__x86_64__ 10 + USER_CFLAGS += -fno-builtin 9 11 10 12 ELF_ARCH := i386:x86-64 11 13 ELF_FORMAT := elf64-x86-64
+2 -2
arch/um/scripts/Makefile.unmap
··· 12 12 13 13 quiet_cmd_wrapld = LD $@ 14 14 define cmd_wrapld 15 - $(LD) -r -o $(obj)/unmap_tmp.o $< $(shell $(CC) -print-file-name=libc.a); \ 16 - $(OBJCOPY) $(obj)/unmap_tmp.o $@ -G switcheroo 15 + $(LD) $(LDFLAGS) -r -o $(obj)/unmap_tmp.o $< $(shell $(CC) $(CFLAGS) -print-file-name=libc.a); \ 16 + $(OBJCOPY) $(UML_OBJCOPYFLAGS) $(obj)/unmap_tmp.o $@ -G switcheroo 17 17 endef 18 18 19 19 $(obj)/unmap_fin.o : $(obj)/unmap.o FORCE