利用shell脚本Hack二进制文件内容 - Eating my own dog food

    工作中用到了一个遗留下来的windows平台的交叉编译工具链,是已经离职的同事编译出来的。功能正常,只是工具链中很多二进制命令中包含了“/cygdrive/h/crosstool。。。”这样的绝对路径,当H盘盘符不幸的分配给光驱或者虚拟光驱的时候,编译等过程中会提示“没有媒介”这样的诡异错误,如果没有H盘或者H盘可读则没问题,没有这方面的知识储备,猜测和搜索路径有关。经过反复测试和查看二进制文件,最终才定位到是这个问题。

    接下来就是怎么work around了,重新编译一个工具链自然是最好的办法,但是一方面没做过,另外之前配置好的环境也人去楼空,请人重新做一个也太耗费他人精力和时间了;请每个用户不要设置H盘为光驱,这个就更没有人性,直接pass;最后既然是windows盘符的问题,那就干脆自力更生,把二进制文件中这个h盘盘符改成c盘,虽没有根治(猜测编译时应该能去掉绝对路径依赖,因为另外一个平台的工具链二进制文件中没有绝对路径),但是可以成功绕开。

    想清楚后剩下的事情就比较好办,把上次“利用shell脚本修正代码风格”的脚本借用过来即可,代码记录如下:

 

 

#!/bin/sh

list_alldir(){
    for file in $1/*
    do
        #echo "cur:$file"
        if [ -d "$file" ]
        then
            echo "dir:$file"
            list_alldir "$file"
        elif [ -f "$file" ]
        then
            #echo "file:$file"
            
              f=`basename $file`
                
              cp -R "$file" "$tmp_dir/$f"
              sed -i 's#/cygdrive/h/crosstool/#/cygdrive/c/crosstool/#g' "$tmp_dir/$f"

              if ! cmp -s "$file" "$tmp_dir/$f"
              then
                  echo "!!!!++++get a file : $f ++++!!!!"
                  d=`dirname $file`
                  mkdir -p "$tmp_dir/$d"
                  mv "$tmp_dir/$f" "$tmp_dir/$d/"
              else
                rm -f "$tmp_dir/$f"
            fi
        fi
    done
}

cur=`pwd`
stamp=`date +%Y%m%d_%H%M%S`
tmp_dir="$cur/$stamp"
echo "tmp_dir:$tmp_dir"
mkdir "$tmp_dir"

if [ $# -gt 0 ]
then
    list_alldir "$1"
else
    list_alldir "."
fi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值