Commit a26ee60f90daffe1de6be0d093af86e7279b3dfd

Authored by Alain Knaff
Committed by H. Peter Anvin
1 parent fb9a4ca982

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.

Signed-off-by: Alain Knaff <alain@knaff.lu>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>

Showing 7 changed files with 135 additions and 20 deletions Side-by-side Diff

... ... @@ -389,7 +389,7 @@
389 389 return len - count;
390 390 }
391 391  
392   -
  392 +#if defined CONFIG_RD_GZIP || defined CONFIG_RD_BZIP2 || defined CONFIG_RD_LZMA
393 393 static int __init flush_buffer(void *bufv, unsigned len)
394 394 {
395 395 char *buf = (char *) bufv;
... ... @@ -412,6 +412,7 @@
412 412 }
413 413 return origLen;
414 414 }
  415 +#endif
415 416  
416 417 static unsigned my_inptr; /* index of next byte to be processed in inbuf */
417 418  
418 419  
... ... @@ -449,10 +450,12 @@
449 450 continue;
450 451 }
451 452 this_header = 0;
  453 +#ifdef CONFIG_RD_GZIP
452 454 if (!gunzip(buf, len, NULL, flush_buffer, NULL,
453 455 &my_inptr, error) &&
454 456 message == NULL)
455 457 goto ok;
  458 +#endif
456 459  
457 460 #ifdef CONFIG_RD_BZIP2
458 461 message = NULL; /* Zero out message, or else cpio will
459 462  
... ... @@ -473,7 +476,9 @@
473 476 goto ok;
474 477 }
475 478 #endif
  479 +#if defined CONFIG_RD_GZIP || defined CONFIG_RD_BZIP2 || defined CONFIG_RD_LZMA
476 480 ok:
  481 +#endif
477 482 if (state != Reset)
478 483 error("junk in compressed archive");
479 484 this_header = saved_offset + my_inptr;
scripts/gen_initramfs_list.sh
... ... @@ -5,7 +5,7 @@
5 5 # Released under the terms of the GNU GPL
6 6 #
7 7 # 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.
9 9 # The script may also be used to generate the inputfile used for gen_init_cpio
10 10 # This script assumes that gen_init_cpio is located in usr/ directory
11 11  
... ... @@ -16,8 +16,8 @@
16 16 cat << EOF
17 17 Usage:
18 18 $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
21 21 -u <uid> User ID to map to user ID 0 (root).
22 22 <uid> is only meaningful if <cpio_source> is a
23 23 directory. "squash" forces all files to uid 0.
... ... @@ -225,6 +225,7 @@
225 225 output="/dev/stdout"
226 226 output_file=""
227 227 is_cpio_compressed=
  228 +compr="gzip -9 -f"
228 229  
229 230 arg="$1"
230 231 case "$arg" in
231 232  
... ... @@ -233,11 +234,15 @@
233 234 echo "deps_initramfs := \\"
234 235 shift
235 236 ;;
236   - "-o") # generate gzipped cpio image named $1
  237 + "-o") # generate compressed cpio image named $1
237 238 shift
238 239 output_file="$1"
239 240 cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"
240 241 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"
241 246 shift
242 247 ;;
243 248 esac
... ... @@ -274,7 +279,7 @@
274 279 esac
275 280 done
276 281  
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
278 283 # we are carefull to delete tmp files
279 284 if [ ! -z ${output_file} ]; then
280 285 if [ -z ${cpio_file} ]; then
... ... @@ -287,7 +292,7 @@
287 292 if [ "${is_cpio_compressed}" = "compressed" ]; then
288 293 cat ${cpio_tfile} > ${output_file}
289 294 else
290   - cat ${cpio_tfile} | gzip -f -9 - > ${output_file}
  295 + cat ${cpio_tfile} | ${compr} - > ${output_file}
291 296 fi
292 297 [ -z ${cpio_file} ] && rm ${cpio_tfile}
293 298 fi
... ... @@ -5,14 +5,32 @@
5 5 klibcdirs:;
6 6 PHONY += klibcdirs
7 7  
  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
8 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 +
  26 +
9 27 # 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
11 29  
12   -# initramfs_data.o contains the initramfs_data.cpio.gz image.
  30 +# initramfs_data.o contains the compressed initramfs_data.cpio image.
13 31 # The image is included using .incbin, a dependency which is not
14 32 # 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
16 34  
17 35 #####
18 36 # Generate the initramfs cpio archive
19 37  
20 38  
21 39  
22 40  
23 41  
... ... @@ -25,28 +43,28 @@
25 43 $(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \
26 44 $(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID))
27 45  
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
29 47 # in initramfs and to detect if any files are added/removed.
30 48 # Removed files are identified by directory timestamp being updated
31 49 # 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
34 52 endif
35 53  
36 54 quiet_cmd_initfs = GEN $@
37 55 cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input)
38 56  
39   -targets := initramfs_data.cpio.gz
  57 +targets := initramfs_data.cpio.gz initramfs_data.cpio.bz2 initramfs_data.cpio.lzma initramfs_data.cpio
40 58 # do not try to update files included in initramfs
41 59 $(deps_initramfs): ;
42 60  
43 61 $(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
46 64 # 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
48 66 # 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
51 69 $(call if_changed,initfs)
usr/initramfs_data.S
... ... @@ -26,5 +26,5 @@
26 26 */
27 27  
28 28 .section .init.ramfs,"a"
29   -.incbin "usr/initramfs_data.cpio.gz"
  29 +.incbin "usr/initramfs_data.cpio"
usr/initramfs_data.bz2.S
  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
  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
  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"