public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Jeff Dike <jdike@addtoit.com>
To: akpm@osdl.org, kai@germaschewski.name, sam@ravnborg.org
Cc: linux-kernel@vger.kernel.org
Subject: [PATCH 1/3] 2.6.8-rc4-mm1 - Fix UML build
Date: Thu, 12 Aug 2004 00:14:55 -0400	[thread overview]
Message-ID: <200408120414.i7C4EtJd010481@ccure.user-mode-linux.org> (raw)

The patch below makes UML build in the face of the ldchk addition to 2.6.8.
The basic problem for UML is that it has always had a two-stage link to produce
the final executable -
	vmlinux contains all the kernel bits, but no libc or gcc libs
	linux is vmlinux plus another .o, massaged by gcc, and linked against 
		libc

This means that, for UML, vmlinux will have unresolved symbols, and will fail
the ldchk test.

I fixed this in a reasonably nasty way by
	adding a $(post-y) to the end of the list of objects
	defining it to be 
		some link flags, an object, and a library from the old linux 
			link command
		a set of libraries pulled from the output of 'gcc -v'
	adding a -L flag to LDFLAGS_vmlinux which points at the location of
		the -lgcc, etc libraries - this is determined by using 'gcc -v'
		to figure out where its spec file is located and assuming that
		its libraries will be located in the same place
	adding arch/um/main.o to $(extra-y) in arch/um/kernel/Makefile because
		I couldn't figure out how to get it to build from 
		arch/um/Makefile

This is all inside UML, except for the $(post-y) in the top-level Makefile.

With this, vmlinux contains all the bits needed for UML, and passes the ldchk
test.  However, it won't run, and a gcc run is needed in order to produce a
real executable.  gcc needs to polish the bits or something.

This getting entirely too familiar with gcc, and I'd appreciate clues about
how to back out of this.  Ideally, I'd like to use the gcc driver as the 
vmlinux linker, but that would require at least rewriting the command, so
I'm not sure how practical that is.

Anyway, you have been warned.  Here it is.  Andrew, please apply.

				Jeff

Index: 2.6.8-rc4-mm1/Makefile
===================================================================
--- 2.6.8-rc4-mm1.orig/Makefile	2004-08-11 22:44:43.000000000 -0400
+++ 2.6.8-rc4-mm1/Makefile	2004-08-11 22:44:49.000000000 -0400
@@ -519,6 +519,7 @@
 	$(drivers-y) \
 	$(net-y) \
 	--end-group \
+	$(post-y) \
 	$(filter .tmp_kallsyms%,$^) \
 	-o $@
 endef
Index: 2.6.8-rc4-mm1/arch/um/Makefile
===================================================================
--- 2.6.8-rc4-mm1.orig/arch/um/Makefile	2004-08-11 22:44:43.000000000 -0400
+++ 2.6.8-rc4-mm1/arch/um/Makefile	2004-08-11 22:44:49.000000000 -0400
@@ -21,6 +21,10 @@
 			   $(ARCH_DIR)/drivers/          \
 			   $(ARCH_DIR)/sys-$(SUBARCH)/
 
+post-y			= --wrap malloc --wrap free --wrap calloc \
+			  $(ARCH_DIR)/main.o -lutil \
+			  --start-group -lgcc -lgcc_eh -lc --end-group
+
 # Have to precede the include because the included Makefiles reference them.
 SYMLINK_HEADERS = archparam.h system.h sigcontext.h processor.h ptrace.h \
 	arch-signal.h module.h
@@ -84,7 +88,10 @@
 
 prepare: $(ARCH_SYMLINKS) $(SYS_HEADERS) $(GEN_HEADERS)
 
-LDFLAGS_vmlinux = -r
+# This stupidity extracts the directory in which gcc lives so that it can
+# be fed to ld when it's linking .tmp_vmlinux during the ldchk stage.
+LD_DIR = $(shell dirname `gcc -v 2>&1 | head -1 | awk '{print $$NF}'`)
+LDFLAGS_vmlinux = -L/usr/lib -L$(LD_DIR) -r
 
 vmlinux: $(ARCH_DIR)/main.o 
 
@@ -126,8 +133,7 @@
 #	$(call if_changed_dep,as_s_S)
 
 linux: vmlinux $(LD_SCRIPT-y)
-	$(CC) -Wl,-T,$(LD_SCRIPT-y) $(LINK-y) $(LINK_WRAPS) \
-		-o linux $(ARCH_DIR)/main.o vmlinux -L/usr/lib -lutil
+	$(CC) -Wl,-T,$(LD_SCRIPT-y) $(LINK-y) -o linux vmlinux
 
 USER_CFLAGS := $(patsubst -I%,,$(CFLAGS))
 USER_CFLAGS := $(patsubst -Derrno=kernel_errno,,$(USER_CFLAGS))
Index: 2.6.8-rc4-mm1/arch/um/kernel/Makefile
===================================================================
--- 2.6.8-rc4-mm1.orig/arch/um/kernel/Makefile	2004-08-11 22:44:43.000000000 -0400
+++ 2.6.8-rc4-mm1/arch/um/kernel/Makefile	2004-08-11 22:44:49.000000000 -0400
@@ -3,7 +3,7 @@
 # Licensed under the GPL
 #
 
-extra-y := vmlinux.lds.s
+extra-y := vmlinux.lds.s ../main.o
 
 obj-y = checksum.o config.o exec_kern.o exitcode.o frame_kern.o frame.o \
 	helper.o init_task.o irq.o irq_user.o ksyms.o mem.o mem_user.o \
@@ -24,7 +24,7 @@
 user-objs-$(CONFIG_TTY_LOG) += tty_log.o
 
 USER_OBJS := $(filter %_user.o,$(obj-y))  $(user-objs-y) config.o helper.o \
-	process.o tempfile.o time.o tty_log.o umid.o user_util.o
+	process.o tempfile.o time.o tty_log.o umid.o user_util.o ../main.o
 USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
 
 CFLAGS_frame.o := $(patsubst -fomit-frame-pointer,,$(USER_CFLAGS))
Index: 2.6.8-rc4-mm1/arch/um/kernel/vmlinux.lds.S
===================================================================
--- 2.6.8-rc4-mm1.orig/arch/um/kernel/vmlinux.lds.S	2004-08-11 22:44:43.000000000 -0400
+++ 2.6.8-rc4-mm1/arch/um/kernel/vmlinux.lds.S	2004-08-11 22:44:49.000000000 -0400
@@ -42,11 +42,10 @@
 
   #include "asm/common.lds.S"
 
-  init.data : { *(init.data) }
+  .init.data : { *(init.data) }
+  .data.init_task : { *(.data.init_task) } 
   .data    :
   {
-    . = ALIGN(KERNEL_STACK_SIZE);		/* init_task */
-    *(.data.init_task)
     *(.data)
     *(.gnu.linkonce.d*)
     CONSTRUCTORS
Index: 2.6.8-rc4-mm1/arch/um/sys-i386/Makefile
===================================================================
--- 2.6.8-rc4-mm1.orig/arch/um/sys-i386/Makefile	2004-08-11 22:44:43.000000000 -0400
+++ 2.6.8-rc4-mm1/arch/um/sys-i386/Makefile	2004-08-11 22:44:49.000000000 -0400
@@ -1,5 +1,5 @@
-obj-y = bugs.o checksum.o fault.o ksyms.o ldt.o ptrace.o ptrace_user.o \
-	semaphore.o sigcontext.o syscalls.o sysrq.o time.o
+obj-y = bitops.o bugs.o checksum.o fault.o ksyms.o ldt.o ptrace.o \
+	ptrace_user.o semaphore.o sigcontext.o syscalls.o sysrq.o time.o
 
 obj-$(CONFIG_HIGHMEM) += highmem.o
 obj-$(CONFIG_MODULES) += module.o
@@ -7,11 +7,12 @@
 USER_OBJS := bugs.o ptrace_user.o sigcontext.o fault.o
 USER_OBJS := $(foreach file,$(USER_OBJS),$(obj)/$(file))
 
-SYMLINKS = semaphore.c highmem.c module.c
+SYMLINKS = bitops.c semaphore.c highmem.c module.c
 SYMLINKS := $(foreach f,$(SYMLINKS),$(src)/$f)
 
 clean-files := $(SYMLINKS)
 
+bitops.c-dir = lib
 semaphore.c-dir = kernel
 highmem.c-dir = mm
 module.c-dir = kernel
Index: 2.6.8-rc4-mm1/arch/um/uml.lds.S
===================================================================
--- 2.6.8-rc4-mm1.orig/arch/um/uml.lds.S	2004-08-11 22:44:43.000000000 -0400
+++ 2.6.8-rc4-mm1/arch/um/uml.lds.S	2004-08-11 22:44:49.000000000 -0400
@@ -11,15 +11,9 @@
 
   __binary_start = .;
 #ifdef MODE_TT
-  .thread_private : {
-    __start_thread_private = .;
-    errno = .;
-    . += 4;
-    arch/um/kernel/tt/unmap_fin.o (.data)
-    __end_thread_private = .;
-  }
+  .thread_private : { *(.thread_private) }
   . = ALIGN(4096);
-  .remap : { arch/um/kernel/tt/unmap_fin.o (.text) }
+  .remap : { *(.remap) }
 #endif
 
   . = ALIGN(4096);		/* Init code and data */


             reply	other threads:[~2004-08-12  3:14 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-08-12  4:14 Jeff Dike [this message]
2004-08-15 22:06 ` [PATCH 1/3] 2.6.8-rc4-mm1 - Fix UML build Andrew Morton
2004-08-17  6:02   ` Jeff Dike
2004-08-17  5:06     ` William Lee Irwin III
2004-08-17  5:10       ` Andrew Morton
2004-08-17 14:45         ` Sam Ravnborg
2004-08-17 12:51           ` Russell King
2004-08-17  5:08     ` Andrew Morton
2004-08-17 19:15       ` Jeff Dike
2004-08-17 18:26         ` Andrew Morton
2004-08-18  2:58           ` Jeff Dike
2004-08-18 18:28           ` Chris Wedgwood
2004-08-17  8:55     ` Andreas Schwab
2004-08-17 18:17       ` Jeff Dike

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=200408120414.i7C4EtJd010481@ccure.user-mode-linux.org \
    --to=jdike@addtoit.com \
    --cc=akpm@osdl.org \
    --cc=kai@germaschewski.name \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sam@ravnborg.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox