usr: Create objectfile for usr filesystem using .incbin
authorSam Ravnborg <sam@mars.ravnborg.org>
Thu, 19 Jun 2003 01:11:50 +0000 (03:11 +0200)
committerSam Ravnborg <sam@mars.ravnborg.org>
Thu, 19 Jun 2003 01:11:50 +0000 (03:11 +0200)
Patch originally by HJ Lu.

The filesystem was previously embedded in a .o file using ld.
Embedding the filesystem using ld broke as a result ia64 and maybe more
architectures.

The better way to do this is to use the .incbin feature, as already
used for vsyscall for i386. .incbin has the advantage that ELH header
is correct, as required by ia64 - and maybe other archs.
This change will break architectures relying on binutils older than
2.11.90.0.23 released on 2001-07-14.
Most notably arm will break in some configurations due to this.
The rationale behing introducing .incbin is that ia64 needs this change
and the .incbin feature has been present in binutils for a number
of years now.
arm will thus have to catch up with binutils - or patch usr/Makefile
to stay compatible with the 2.5 kernel.

The definition of LDFLAGS_BLOB removed for all architectures - it was
obsoleted by this change.
Except for arm - that may require it due to the tool compatibility issue.

17 files changed:
arch/alpha/Makefile
arch/h8300/Makefile
arch/i386/Makefile
arch/m68k/Makefile
arch/m68knommu/Makefile
arch/parisc/Makefile
arch/ppc/Makefile
arch/ppc64/Makefile
arch/s390/Makefile
arch/sh/Makefile
arch/sparc/Makefile
arch/sparc64/Makefile
arch/v850/Makefile
arch/x86_64/Makefile
usr/Makefile
usr/initramfs_data.S [new file with mode: 0644]
usr/initramfs_data.scr [deleted file]

index 9ee21e0..fa248f6 100644 (file)
@@ -11,7 +11,6 @@
 NM := $(NM) -B
 
 LDFLAGS_vmlinux        := -static -N #-relax
-LDFLAGS_BLOB   := --format binary --oformat elf64-alpha
 cflags-y       := -pipe -mno-fp-regs -ffixed-8
 
 # Determine if we can use the BWX instructions with GAS.
index 105db70..5ed84ef 100644 (file)
@@ -34,7 +34,6 @@ CFLAGS += -D__linux__
 CFLAGS += -DUTS_SYSNAME=\"uClinux\" -DTARGET=$(BOARD)
 AFLAGS += -DPLATFORM=$(PLATFORM) -DTARGET=$(BOARD) -DMODEL=$(MODEL) $(cflags-y)
 LDFLAGS += $(ldflags-y)
-LDFLAGS_BLOB :=  --format binary --oformat elf32-h8300
 
 CROSS_COMPILE = h8300-elf-
 #HEAD := arch/$(ARCH)/platform/$(platform-y)/$(board-y)/crt0_$(model-y).o
index 8292045..01f4853 100644 (file)
@@ -18,7 +18,6 @@
 LDFLAGS                := -m elf_i386
 OBJCOPYFLAGS   := -O binary -R .note -R .comment -S
 LDFLAGS_vmlinux :=
-LDFLAGS_BLOB   := --format binary --oformat elf32-i386
 
 CFLAGS += -pipe
 
index 45aaa73..2091b1c 100644 (file)
@@ -19,7 +19,6 @@ COMPILE_ARCH = $(shell uname -m)
 # override top level makefile
 AS += -m68020
 LDFLAGS := -m m68kelf
-LDFLAGS_BLOB := --format binary --oformat elf32-m68k
 ifneq ($(COMPILE_ARCH),$(ARCH))
        # prefix for cross-compiling binaries
        CROSS_COMPILE = m68k-linux-
index e7f435a..53fb220 100644 (file)
@@ -85,8 +85,6 @@ CFLAGS += -O2 -g
 CFLAGS += -D__linux__
 CFLAGS += -DUTS_SYSNAME=\"uClinux\"
 
-LDFLAGS_BLOB   := --format binary --oformat elf32-m68k
-
 head-y := arch/m68knommu/platform/$(platform-y)/$(board-y)/crt0_$(model-y).o
 
 CLEAN_FILES := include/asm-$(ARCH)/asm-offsets.h \
index 0360608..f615675 100644 (file)
 ifdef CONFIG_PARISC64
 CROSS_COMPILE  := hppa64-linux-
 UTS_MACHINE    := parisc64
-LDFLAGS_BLOB   := --format binary --oformat elf64-hppa-linux
 else
 MACHINE := $(subst 64,,$(shell uname -m))
 ifneq ($(MACHINE),parisc)
 CROSS_COMPILE  := hppa-linux-
 endif
-LDFLAGS_BLOB   := --format binary --oformat elf32-hppa-linux
 endif
 
 FINAL_LD=$(CROSS_COMPILE)ld --warn-common --warn-section-align 
index a4c2f61..033f661 100644 (file)
@@ -13,7 +13,6 @@
 # This must match PAGE_OFFSET in include/asm-ppc/page.h.
 KERNELLOAD     := $(CONFIG_KERNEL_START)
 
-LDFLAGS_BLOB   := --format binary --oformat elf32-powerpc
 LDFLAGS_vmlinux        := -Ttext $(KERNELLOAD) -Bstatic
 CPPFLAGS       += -Iarch/$(ARCH)
 AFLAGS         += -Iarch/$(ARCH)
index 5143955..6758cfc 100644 (file)
@@ -17,7 +17,6 @@ KERNELLOAD    := 0xc000000000000000
 
 LDFLAGS                := -m elf64ppc
 LDFLAGS_vmlinux        := -Bstatic -e $(KERNELLOAD) -Ttext $(KERNELLOAD)
-LDFLAGS_BLOB   := --format binary --oformat elf64-powerpc
 CFLAGS         += -msoft-float -pipe -Wno-uninitialized -mminimal-toc \
                -mtraceback=full -mcpu=power4
 
index ca75bce..cd690cd 100644 (file)
@@ -15,7 +15,6 @@
 
 ifdef CONFIG_ARCH_S390_31
 LDFLAGS                := -m elf_s390
-LDFLAGS_BLOB   := --format binary --oformat elf32-s390
 CFLAGS         += -m31
 UTS_MACHINE    := s390
 endif
@@ -23,7 +22,6 @@ endif
 ifdef CONFIG_ARCH_S390X
 LDFLAGS                := -m elf64_s390
 MODFLAGS       += -fpic -D__PIC__
-LDFLAGS_BLOB   := --format binary --oformat elf64-s390
 CFLAGS         += -m64
 UTS_MACHINE    := s390x
 endif
index e965c9b..b946323 100644 (file)
@@ -50,10 +50,8 @@ LDFLAGS_vmlinux     += -e _stext
 
 ifdef CONFIG_CPU_LITTLE_ENDIAN
 LDFLAGS_vmlinux     +=  --defsym 'jiffies=jiffies_64' -EL
-LDFLAGS_BLOB    :=--format binary --oformat elf32-sh-linux
 else
 LDFLAGS_vmlinux     +=  --defsym 'jiffies=jiffies_64+4' -EB
-LDFLAGS_BLOB    :=--format binary --oformat elf32-shbig-linux
 endif
 
 CFLAGS         += -pipe $(cpu-y)
index e8f1636..66e283a 100644 (file)
@@ -23,8 +23,6 @@ AS              := $(AS) -32
 LDFLAGS                := -m elf32_sparc
 endif
 
-LDFLAGS_BLOB   := --format binary --oformat elf32-sparc
-
 #CFLAGS := $(CFLAGS) -g -pipe -fcall-used-g5 -fcall-used-g7
 ifneq ($(IS_EGCS),y)
 CFLAGS := $(CFLAGS) -pipe -mno-fpu -fcall-used-g5 -fcall-used-g7
index 7a36556..a48cd18 100644 (file)
@@ -32,7 +32,6 @@ RANLIB                = sparc64-linux-ranlib
 else
 AS             := $(AS) -64
 LDFLAGS                := -m elf64_sparc
-LDFLAGS_BLOB   := --format binary --oformat elf64-sparc
 endif
 
 ifneq ($(UNDECLARED_REGS),y)
index f1d21d6..6edaed4 100644 (file)
@@ -27,7 +27,6 @@ CFLAGS += -D__linux__ -DUTS_SYSNAME=\"uClinux\"
 # some reason)
 LDFLAGS_MODULE += --unique=.gnu.linkonce.this_module
 
-LDFLAGS_BLOB := -b binary --oformat elf32-little
 OBJCOPY_FLAGS_BLOB := -I binary -O elf32-little -B v850e
 
 
index 35447c8..2f6e40f 100644 (file)
@@ -36,7 +36,6 @@ export IA32_CC IA32_LD IA32_AS IA32_OBJCOPY IA32_CPP
 LDFLAGS                := -m elf_x86_64
 OBJCOPYFLAGS   := -O binary -R .note -R .comment -S
 LDFLAGS_vmlinux := -e stext
-LDFLAGS_BLOB   := --format binary --oformat elf64-x86-64
 
 CFLAGS += -mno-red-zone
 CFLAGS += -mcmodel=kernel
index 58a915e..fe62659 100644 (file)
@@ -5,11 +5,10 @@ host-progs  := gen_init_cpio
 
 clean-files := initramfs_data.cpio.gz
 
-LDFLAGS_initramfs_data.o := $(LDFLAGS_BLOB) -r -T
-
-$(obj)/initramfs_data.o: $(src)/initramfs_data.scr \
-                        $(obj)/initramfs_data.cpio.gz FORCE
-       $(call if_changed,ld)
+# initramfs_data.o contains the initramfs_data.cpio.gz image.
+# The image is included using .incbin, a dependency which is not
+# tracked automatically.
+$(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz FORCE
 
 # initramfs-y are the programs which will be copied into the CPIO
 # archive. Currently, the filenames are hardcoded in gen_init_cpio,
diff --git a/usr/initramfs_data.S b/usr/initramfs_data.S
new file mode 100644 (file)
index 0000000..c2e1ad4
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+  initramfs_data includes the compressed binary that is the
+  filesystem used for early user space.
+  Note: Older versions of "as" (prior to binutils 2.11.90.0.23
+  released on 2001-07-14) dit not support .incbin.
+  If you are forced to use older binutils than that then the
+  following trick can be applied to create the resulting binary:
+
+
+  ld -m elf_i386  --format binary --oformat elf32-i386 -r \
+  -T initramfs_data.scr initramfs_data.cpio.gz -o initramfs_data.o
+   ld -m elf_i386  -r -o built-in.o initramfs_data.o
+
+  initramfs_data.scr looks like this:
+SECTIONS
+{
+       .init.ramfs : { *(.data) }
+}
+
+  The above example is for i386 - the parameters vary from architectures.
+  Eventually look up LDFLAGS_BLOB in an older version of the
+  arch/$(ARCH)/Makefile to see the flags used before .incbin was introduced.
+
+  Using .incbin has the advantage over ld that the correct flags are set
+  in the ELF header, as required by certain architectures.
+*/
+
+.section .init.ramfs,"a"
+.incbin "usr/initramfs_data.cpio.gz"
+
diff --git a/usr/initramfs_data.scr b/usr/initramfs_data.scr
deleted file mode 100644 (file)
index bf6d172..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-SECTIONS
-{
-       .init.ramfs : { *(.data) }
-}