History

bzip2/lzma: fix built-in initramfs vs CONFIG_RD_GZIP

Impact: Resolves build failures in some configurations Makes it possible to disable CONFIG_RD_GZIP . In that case, the built-in initramfs will be compressed by whatever compressor is available (bzip2 or lzma) or left uncompressed if none is available. It also removes a couple of warnings which occur when no ramdisk compression at all is chosen. It also restores the select ZLIB_INFLATE in drivers/block/Kconfig which somehow came missing. This is needed to activate compilation of the stuff in zlib_deflate.

Alain Knaff committed 17 years ago

Commit a26ee601 parent fb9a4ca7 files · +135 −20Browse files

Unified · Split

7 files
  1. init/initramfs.c +6 −1
  2. scripts/gen_initramfs_list.sh +11 −6
  3. usr/Makefile +30 −12
  4. usr/initramfs_data.S +1 −1
  5. usr/initramfs_data.bz2.S +29 −0
  6. usr/initramfs_data.gz.S +29 −0
  7. usr/initramfs_data.lzma.S +29 −0
init/initramfs.c+6−1
@@ -389,7 +389,7 @@ static int __init write_buffer(char *buf, unsigned len) · 388 unmodified lines
389389 return len - count;
390390 }
391391
392−
392+#if defined CONFIG_RD_GZIP || defined CONFIG_RD_BZIP2 || defined CONFIG_RD_LZMA
393393 static int __init flush_buffer(void *bufv, unsigned len)
394394 {
395395 char *buf = (char *) bufv;
@@ -412,6 +412,7 @@ static int __init flush_buffer(void *bufv, unsigned len) · 16 unmodified lines
412412 }
413413 return origLen;
414414 }
415+#endif
415416
416417 static unsigned my_inptr; /* index of next byte to be processed in inbuf */
417418
@@ -449,10 +450,12 @@ static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only) · 31 unmodified lines
449450 continue;
450451 }
451452 this_header = 0;
453+#ifdef CONFIG_RD_GZIP
452454 if (!gunzip(buf, len, NULL, flush_buffer, NULL,
453455 &my_inptr, error) &&
454456 message == NULL)
455457 goto ok;
458+#endif
456459
457460 #ifdef CONFIG_RD_BZIP2
458461 message = NULL; /* Zero out message, or else cpio will
@@ -473,7 +476,9 @@ static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only) · 14 unmodified lines
473476 goto ok;
474477 }
475478 #endif
479+#if defined CONFIG_RD_GZIP || defined CONFIG_RD_BZIP2 || defined CONFIG_RD_LZMA
476480 ok:
481+#endif
477482 if (state != Reset)
478483 error("junk in compressed archive");
479484 this_header = saved_offset + my_inptr;
scripts/gen_initramfs_list.sh+11−6
@@ -5,7 +5,7 @@ · 4 unmodified lines
55 # Released under the terms of the GNU GPL
66 #
77 # Generate a cpio packed initramfs. It uses gen_init_cpio to generate
8−# the cpio archive, and gzip to pack it.
8+# the cpio archive, and then compresses it.
99 # The script may also be used to generate the inputfile used for gen_init_cpio
1010 # This script assumes that gen_init_cpio is located in usr/ directory
1111
@@ -16,8 +16,8 @@ usage() { · 4 unmodified lines
1616 cat << EOF
1717 Usage:
1818 $0 [-o <file>] [-u <uid>] [-g <gid>] {-d | <cpio_source>} ...
19− -o <file> Create gzipped initramfs file named <file> using
20− gen_init_cpio and gzip
19+ -o <file> Create compressed initramfs file named <file> using
20+ gen_init_cpio and compressor depending on the extension
2121 -u <uid> User ID to map to user ID 0 (root).
2222 <uid> is only meaningful if <cpio_source> is a
2323 directory. "squash" forces all files to uid 0.
@@ -225,6 +225,7 @@ cpio_list= · 201 unmodified lines
225225 output="/dev/stdout"
226226 output_file=""
227227 is_cpio_compressed=
228+compr="gzip -9 -f"
228229
229230 arg="$1"
230231 case "$arg" in
@@ -233,11 +234,15 @@ case "$arg" in · 2 unmodified lines
233234 echo "deps_initramfs := \\"
234235 shift
235236 ;;
236− "-o") # generate gzipped cpio image named $1
237+ "-o") # generate compressed cpio image named $1
237238 shift
238239 output_file="$1"
239240 cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"
240241 output=${cpio_list}
242+ echo "$output_file" | grep -q "\.gz$" && compr="gzip -9 -f"
243+ echo "$output_file" | grep -q "\.bz2$" && compr="bzip2 -9 -f"
244+ echo "$output_file" | grep -q "\.lzma$" && compr="lzma -9 -f"
245+ echo "$output_file" | grep -q "\.cpio$" && compr="cat"
241246 shift
242247 ;;
243248 esac
@@ -274,7 +279,7 @@ while [ $# -gt 0 ]; do · 30 unmodified lines
274279 esac
275280 done
276281
277−# If output_file is set we will generate cpio archive and gzip it
282+# If output_file is set we will generate cpio archive and compress it
278283 # we are carefull to delete tmp files
279284 if [ ! -z ${output_file} ]; then
280285 if [ -z ${cpio_file} ]; then
@@ -287,7 +292,7 @@ if [ ! -z ${output_file} ]; then · 6 unmodified lines
287292 if [ "${is_cpio_compressed}" = "compressed" ]; then
288293 cat ${cpio_tfile} > ${output_file}
289294 else
290− cat ${cpio_tfile} | gzip -f -9 - > ${output_file}
295+ cat ${cpio_tfile} | ${compr} - > ${output_file}
291296 fi
292297 [ -z ${cpio_file} ] && rm ${cpio_tfile}
293298 fi
usr/Makefile+30−12
@@ -5,14 +5,32 @@ · 4 unmodified lines
55 klibcdirs:;
66 PHONY += klibcdirs
77
8+# Find out "preferred" ramdisk compressor. Order of preference is
9+# 1. bzip2 efficient, and likely to be present
10+# 2. gzip former default
11+# 3. lzma
12+# 4. none
13+
14+# None of the above
15+suffix_y =
16+
17+# Lzma, but no gzip nor bzip2
18+suffix_$(CONFIG_RD_LZMA) = .lzma
19+
20+# Gzip, but no bzip2
21+suffix_$(CONFIG_RD_GZIP) = .gz
22+
23+# Bzip2
24+suffix_$(CONFIG_RD_BZIP2) = .bz2
25+
826
927 # Generate builtin.o based on initramfs_data.o
10−obj-$(CONFIG_BLK_DEV_INITRD) := initramfs_data.o
28+obj-$(CONFIG_BLK_DEV_INITRD) := initramfs_data$(suffix_y).o
1129
12−# initramfs_data.o contains the initramfs_data.cpio.gz image.
30+# initramfs_data.o contains the compressed initramfs_data.cpio image.
1331 # The image is included using .incbin, a dependency which is not
1432 # tracked automatically.
15−$(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz FORCE
33+$(obj)/initramfs_data$(suffix_y).o: $(obj)/initramfs_data.cpio$(suffix_y) FORCE
1634
1735 #####
1836 # Generate the initramfs cpio archive
@@ -25,28 +43,28 @@ ramfs-args := \ · 6 unmodified lines
2543 $(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \
2644 $(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID))
2745
28−# .initramfs_data.cpio.gz.d is used to identify all files included
46+# .initramfs_data.cpio.d is used to identify all files included
2947 # in initramfs and to detect if any files are added/removed.
3048 # Removed files are identified by directory timestamp being updated
3149 # The dependency list is generated by gen_initramfs.sh -l
32−ifneq ($(wildcard $(obj)/.initramfs_data.cpio.gz.d),)
33− include $(obj)/.initramfs_data.cpio.gz.d
50+ifneq ($(wildcard $(obj)/.initramfs_data.cpio.d),)
51+ include $(obj)/.initramfs_data.cpio.d
3452 endif
3553
3654 quiet_cmd_initfs = GEN $@
3755 cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input)
3856
39−targets := initramfs_data.cpio.gz
57+targets := initramfs_data.cpio.gz initramfs_data.cpio.bz2 initramfs_data.cpio.lzma initramfs_data.cpio
4058 # do not try to update files included in initramfs
4159 $(deps_initramfs): ;
4260
4361 $(deps_initramfs): klibcdirs
44−# We rebuild initramfs_data.cpio.gz if:
45−# 1) Any included file is newer then initramfs_data.cpio.gz
62+# We rebuild initramfs_data.cpio if:
63+# 1) Any included file is newer then initramfs_data.cpio
4664 # 2) There are changes in which files are included (added or deleted)
47−# 3) If gen_init_cpio are newer than initramfs_data.cpio.gz
65+# 3) If gen_init_cpio are newer than initramfs_data.cpio
4866 # 4) arguments to gen_initramfs.sh changes
49−$(obj)/initramfs_data.cpio.gz: $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs
50− $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/.initramfs_data.cpio.gz.d
67+$(obj)/initramfs_data.cpio$(suffix_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs
68+ $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/.initramfs_data.cpio.d
5169 $(call if_changed,initfs)
5270
usr/initramfs_data.S+1−1
@@ -26,5 +26,5 @@ SECTIONS · 25 unmodified lines
2626 */
2727
2828 .section .init.ramfs,"a"
29−.incbin "usr/initramfs_data.cpio.gz"
29+.incbin "usr/initramfs_data.cpio"
3030
usr/initramfs_data.bz2.S+29−0
@@ -0,0 +1,29 @@
1+/*
2+ initramfs_data includes the compressed binary that is the
3+ filesystem used for early user space.
4+ Note: Older versions of "as" (prior to binutils 2.11.90.0.23
5+ released on 2001-07-14) dit not support .incbin.
6+ If you are forced to use older binutils than that then the
7+ following trick can be applied to create the resulting binary:
8+
9+
10+ ld -m elf_i386 --format binary --oformat elf32-i386 -r \
11+ -T initramfs_data.scr initramfs_data.cpio.gz -o initramfs_data.o
12+ ld -m elf_i386 -r -o built-in.o initramfs_data.o
13+
14+ initramfs_data.scr looks like this:
15+SECTIONS
16+{
17+ .init.ramfs : { *(.data) }
18+}
19+
20+ The above example is for i386 - the parameters vary from architectures.
21+ Eventually look up LDFLAGS_BLOB in an older version of the
22+ arch/$(ARCH)/Makefile to see the flags used before .incbin was introduced.
23+
24+ Using .incbin has the advantage over ld that the correct flags are set
25+ in the ELF header, as required by certain architectures.
26+*/
27+
28+.section .init.ramfs,"a"
29+.incbin "usr/initramfs_data.cpio.bz2"
usr/initramfs_data.gz.S+29−0
@@ -0,0 +1,29 @@
1+/*
2+ initramfs_data includes the compressed binary that is the
3+ filesystem used for early user space.
4+ Note: Older versions of "as" (prior to binutils 2.11.90.0.23
5+ released on 2001-07-14) dit not support .incbin.
6+ If you are forced to use older binutils than that then the
7+ following trick can be applied to create the resulting binary:
8+
9+
10+ ld -m elf_i386 --format binary --oformat elf32-i386 -r \
11+ -T initramfs_data.scr initramfs_data.cpio.gz -o initramfs_data.o
12+ ld -m elf_i386 -r -o built-in.o initramfs_data.o
13+
14+ initramfs_data.scr looks like this:
15+SECTIONS
16+{
17+ .init.ramfs : { *(.data) }
18+}
19+
20+ The above example is for i386 - the parameters vary from architectures.
21+ Eventually look up LDFLAGS_BLOB in an older version of the
22+ arch/$(ARCH)/Makefile to see the flags used before .incbin was introduced.
23+
24+ Using .incbin has the advantage over ld that the correct flags are set
25+ in the ELF header, as required by certain architectures.
26+*/
27+
28+.section .init.ramfs,"a"
29+.incbin "usr/initramfs_data.cpio.gz"
usr/initramfs_data.lzma.S+29−0
@@ -0,0 +1,29 @@
1+/*
2+ initramfs_data includes the compressed binary that is the
3+ filesystem used for early user space.
4+ Note: Older versions of "as" (prior to binutils 2.11.90.0.23
5+ released on 2001-07-14) dit not support .incbin.
6+ If you are forced to use older binutils than that then the
7+ following trick can be applied to create the resulting binary:
8+
9+
10+ ld -m elf_i386 --format binary --oformat elf32-i386 -r \
11+ -T initramfs_data.scr initramfs_data.cpio.gz -o initramfs_data.o
12+ ld -m elf_i386 -r -o built-in.o initramfs_data.o
13+
14+ initramfs_data.scr looks like this:
15+SECTIONS
16+{
17+ .init.ramfs : { *(.data) }
18+}
19+
20+ The above example is for i386 - the parameters vary from architectures.
21+ Eventually look up LDFLAGS_BLOB in an older version of the
22+ arch/$(ARCH)/Makefile to see the flags used before .incbin was introduced.
23+
24+ Using .incbin has the advantage over ld that the correct flags are set
25+ in the ELF header, as required by certain architectures.
26+*/
27+
28+.section .init.ramfs,"a"
29+.incbin "usr/initramfs_data.cpio.lzma"