Skip to content

Commit a26ee60

Browse files
Alain KnaffH. Peter Anvin
authored andcommitted
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>
1 parent fb9a4ca commit a26ee60

7 files changed

Lines changed: 135 additions & 20 deletions

File tree

init/initramfs.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ static int __init write_buffer(char *buf, unsigned len)
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)
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)
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)
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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
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() {
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=
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
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
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
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

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,32 @@
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 := \
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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,5 +26,5 @@ SECTIONS
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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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"

0 commit comments

Comments
 (0)