现象
make -f scripts/Makefile.build obj=arch/arm/boot/compressed arch/arm/boot/compressed/vmlinux
(cat arch/arm/boot/compressed/../Image_igs | lzop -9 && printf ) > arch/arm/boot/compressed/piggy.lzo || (rm -f arch/arm/boot/compressed/piggy.lzo ; false)
注意看:printf后面是空!正确的内容应该是 printf \000\146\204\000
但我在编译内核的过程中,总有很大的概率出现printf后面什么都没有
的情况!
几经搜索,发现这个命令出自kernel/scripts/Makefile.lib
中的:
# Bzip2 and LZMA do not include size in file... so we have to fake that;
# append the size as a 32-bit littleendian number as gzip does.
size_append = printf $(shell \
dec_size=0; \
for F in $1; do \
fsize=$$(stat -c "%s" $$F); \
dec_size=$$(expr $$dec_size + $$fsize); \
done; \
printf "%08x\n" $$dec_size | \
sed 's/\(..\)/\1 /g' | { \
read ch0 ch1 ch2 ch3; \
for ch in $$ch3 $$ch2 $$ch1 $$ch0; do \
printf '%s%03o' '\\' $$((0x$$ch)); \
done; \
} \
)
修改后的版本
这里面一定有某个BUG在触发,后面那一坨代码写的实在是太差!并且我不太喜欢8进制的表达方式,决定修改成另外的16进制版本
参照:https://stackoverflow.com/questions/30020152/awk-little-endian-order-and-4-hex-digits
awk '{hex=sprintf("%08X",$1); for (i=7;i>=1;i=i-2) printf "\\x%s",substr(hex,i,2);}'
最后修改成:
# modified by Manfeel 2022-09-08
size_append = printf "$(shell \
dec_size=0; \
for F in $1; do \
fsize=$$(stat -c "%s" $$F); \
dec_size=$$(expr $$dec_size + $$fsize); \
done; \
printf "%08x\n" $$dec_size | awk '{for (i=7;i>=1;i=i-2) printf "\\x%s",substr($$1,i,2);}' \
)"
完美收工!