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
389 return len - count;389 return len - count;
390}390}
391 391
392 392#if defined CONFIG_RD_GZIP || defined CONFIG_RD_BZIP2 || defined CONFIG_RD_LZMA
393static int __init flush_buffer(void *bufv, unsigned len)393static int __init flush_buffer(void *bufv, unsigned len)
394{394{
395 char *buf = (char *) bufv;395 char *buf = (char *) bufv;
@@ -412,6 +412,7 @@ static int __init flush_buffer(void *bufv, unsigned len) · 16 unmodified lines
412 }412 }
413 return origLen;413 return origLen;
414}414}
415#endif
415 416
416static unsigned my_inptr; /* index of next byte to be processed in inbuf */417static unsigned my_inptr; /* index of next byte to be processed in inbuf */
417 418
@@ -449,10 +450,12 @@ static char * __init unpack_to_rootfs(char *buf, unsigned len, int check_only) · 31 unmodified lines
449 continue;450 continue;
450 }451 }
451 this_header = 0;452 this_header = 0;
453#ifdef CONFIG_RD_GZIP
452 if (!gunzip(buf, len, NULL, flush_buffer, NULL,454 if (!gunzip(buf, len, NULL, flush_buffer, NULL,
453 &my_inptr, error) &&455 &my_inptr, error) &&
454 message == NULL)456 message == NULL)
455 goto ok;457 goto ok;
458#endif
456 459
457#ifdef CONFIG_RD_BZIP2460#ifdef CONFIG_RD_BZIP2
458 message = NULL; /* Zero out message, or else cpio will461 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
473 goto ok;476 goto ok;
474 }477 }
475#endif478#endif
479#if defined CONFIG_RD_GZIP || defined CONFIG_RD_BZIP2 || defined CONFIG_RD_LZMA
476ok:480ok:
481#endif
477 if (state != Reset)482 if (state != Reset)
478 error("junk in compressed archive");483 error("junk in compressed archive");
479 this_header = saved_offset + my_inptr;484 this_header = saved_offset + my_inptr;
scripts/gen_initramfs_list.sh+11−6
@@ -5,7 +5,7 @@ · 4 unmodified lines
5# Released under the terms of the GNU GPL5# Released under the terms of the GNU GPL
6#6#
7# Generate a cpio packed initramfs. It uses gen_init_cpio to generate7# 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# The script may also be used to generate the inputfile used for gen_init_cpio9# The script may also be used to generate the inputfile used for gen_init_cpio
10# This script assumes that gen_init_cpio is located in usr/ directory10# This script assumes that gen_init_cpio is located in usr/ directory
11 11
@@ -16,8 +16,8 @@ usage() { · 4 unmodified lines
16cat << EOF16cat << EOF
17Usage:17Usage:
18$0 [-o <file>] [-u <uid>] [-g <gid>] {-d | <cpio_source>} ...18$0 [-o <file>] [-u <uid>] [-g <gid>] {-d | <cpio_source>} ...
19 -o <file> Create gzipped initramfs file named <file> using19 -o <file> Create compressed initramfs file named <file> using
20 gen_init_cpio and gzip20 gen_init_cpio and compressor depending on the extension
21 -u <uid> User ID to map to user ID 0 (root).21 -u <uid> User ID to map to user ID 0 (root).
22 <uid> is only meaningful if <cpio_source> is a22 <uid> is only meaningful if <cpio_source> is a
23 directory. "squash" forces all files to uid 0.23 directory. "squash" forces all files to uid 0.
@@ -225,6 +225,7 @@ cpio_list= · 201 unmodified lines
225output="/dev/stdout"225output="/dev/stdout"
226output_file=""226output_file=""
227is_cpio_compressed=227is_cpio_compressed=
228compr="gzip -9 -f"
228 229
229arg="$1"230arg="$1"
230case "$arg" in231case "$arg" in
@@ -233,11 +234,15 @@ case "$arg" in · 2 unmodified lines
233 echo "deps_initramfs := \\"234 echo "deps_initramfs := \\"
234 shift235 shift
235 ;;236 ;;
236 "-o") # generate gzipped cpio image named $1237 "-o") # generate compressed cpio image named $1
237 shift238 shift
238 output_file="$1"239 output_file="$1"
239 cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"240 cpio_list="$(mktemp ${TMPDIR:-/tmp}/cpiolist.XXXXXX)"
240 output=${cpio_list}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 shift246 shift
242 ;;247 ;;
243esac248esac
@@ -274,7 +279,7 @@ while [ $# -gt 0 ]; do · 30 unmodified lines
274 esac279 esac
275done280done
276 281
277# If output_file is set we will generate cpio archive and gzip it282# If output_file is set we will generate cpio archive and compress it
278# we are carefull to delete tmp files283# we are carefull to delete tmp files
279if [ ! -z ${output_file} ]; then284if [ ! -z ${output_file} ]; then
280 if [ -z ${cpio_file} ]; then285 if [ -z ${cpio_file} ]; then
@@ -287,7 +292,7 @@ if [ ! -z ${output_file} ]; then · 6 unmodified lines
287 if [ "${is_cpio_compressed}" = "compressed" ]; then292 if [ "${is_cpio_compressed}" = "compressed" ]; then
288 cat ${cpio_tfile} > ${output_file}293 cat ${cpio_tfile} > ${output_file}
289 else294 else
290 cat ${cpio_tfile} | gzip -f -9 - > ${output_file}295 cat ${cpio_tfile} | ${compr} - > ${output_file}
291 fi296 fi
292 [ -z ${cpio_file} ] && rm ${cpio_tfile}297 [ -z ${cpio_file} ] && rm ${cpio_tfile}
293fi298fi
usr/Makefile+30−12
@@ -5,14 +5,32 @@ · 4 unmodified lines
5klibcdirs:;5klibcdirs:;
6PHONY += klibcdirs6PHONY += 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
13
14# None of the above
15suffix_y =
16
17# Lzma, but no gzip nor bzip2
18suffix_$(CONFIG_RD_LZMA) = .lzma
19
20# Gzip, but no bzip2
21suffix_$(CONFIG_RD_GZIP) = .gz
22
23# Bzip2
24suffix_$(CONFIG_RD_BZIP2) = .bz2
25
8 26
9# Generate builtin.o based on initramfs_data.o27# Generate builtin.o based on initramfs_data.o
10obj-$(CONFIG_BLK_DEV_INITRD) := initramfs_data.o28obj-$(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# The image is included using .incbin, a dependency which is not31# The image is included using .incbin, a dependency which is not
14# tracked automatically.32# tracked automatically.
15$(obj)/initramfs_data.o: $(obj)/initramfs_data.cpio.gz FORCE33$(obj)/initramfs_data$(suffix_y).o: $(obj)/initramfs_data.cpio$(suffix_y) FORCE
16 34
17#####35#####
18# Generate the initramfs cpio archive36# Generate the initramfs cpio archive
@@ -25,28 +43,28 @@ ramfs-args := \ · 6 unmodified lines
25 $(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \43 $(if $(CONFIG_INITRAMFS_ROOT_UID), -u $(CONFIG_INITRAMFS_ROOT_UID)) \
26 $(if $(CONFIG_INITRAMFS_ROOT_GID), -g $(CONFIG_INITRAMFS_ROOT_GID))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 included46# .initramfs_data.cpio.d is used to identify all files included
29# in initramfs and to detect if any files are added/removed.47# in initramfs and to detect if any files are added/removed.
30# Removed files are identified by directory timestamp being updated48# Removed files are identified by directory timestamp being updated
31# The dependency list is generated by gen_initramfs.sh -l49# The dependency list is generated by gen_initramfs.sh -l
32ifneq ($(wildcard $(obj)/.initramfs_data.cpio.gz.d),)50ifneq ($(wildcard $(obj)/.initramfs_data.cpio.d),)
33 include $(obj)/.initramfs_data.cpio.gz.d51 include $(obj)/.initramfs_data.cpio.d
34endif52endif
35 53
36quiet_cmd_initfs = GEN $@54quiet_cmd_initfs = GEN $@
37 cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input)55 cmd_initfs = $(initramfs) -o $@ $(ramfs-args) $(ramfs-input)
38 56
39targets := initramfs_data.cpio.gz57targets := initramfs_data.cpio.gz initramfs_data.cpio.bz2 initramfs_data.cpio.lzma initramfs_data.cpio
40# do not try to update files included in initramfs58# do not try to update files included in initramfs
41$(deps_initramfs): ;59$(deps_initramfs): ;
42 60
43$(deps_initramfs): klibcdirs61$(deps_initramfs): klibcdirs
44# We rebuild initramfs_data.cpio.gz if:62# We rebuild initramfs_data.cpio if:
45# 1) Any included file is newer then initramfs_data.cpio.gz63# 1) Any included file is newer then initramfs_data.cpio
46# 2) There are changes in which files are included (added or deleted)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.gz65# 3) If gen_init_cpio are newer than initramfs_data.cpio
48# 4) arguments to gen_initramfs.sh changes66# 4) arguments to gen_initramfs.sh changes
49$(obj)/initramfs_data.cpio.gz: $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs67$(obj)/initramfs_data.cpio$(suffix_y): $(obj)/gen_init_cpio $(deps_initramfs) klibcdirs
50 $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/.initramfs_data.cpio.gz.d68 $(Q)$(initramfs) -l $(ramfs-input) > $(obj)/.initramfs_data.cpio.d
51 $(call if_changed,initfs)69 $(call if_changed,initfs)
52 70
usr/initramfs_data.S+1−1
@@ -26,5 +26,5 @@ SECTIONS · 25 unmodified lines
26*/26*/
27 27
28.section .init.ramfs,"a"28.section .init.ramfs,"a"
29.incbin "usr/initramfs_data.cpio.gz"29.incbin "usr/initramfs_data.cpio"
30 30
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:
15SECTIONS
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:
15SECTIONS
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:
15SECTIONS
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"