编译内核的时候,出现 printf 命令后面为空的错误!

7 篇文章 0 订阅
3 篇文章 0 订阅

现象

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);}' \
)"

完美收工!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值