gcc pass-1
for file in \
$(find gcc/config -name linux64.h -o -name linux.h -o -name sysv4.h) /* 在gcc/config目录下寻找linux64.h/linux.h/sysv4.h头文件, -o 是或的意思 */do
cp -uv $file{,.orig} /* 复制找到的文件并命名为 $.orig. 比如linux.h--> linux.h.orig. -u参数表明只有源文件比目的文件新或者目的文件不存在才会复制, 这样就避免了二次替换,比如替换为/tools/tools/lib/32 */
sed -e 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \ /* s@pattern@replacement@g, 这里s为替换的意思(substitute), @为分隔符, 和/分隔符一样, 貌似用其他的特殊字符充当分隔符也可以(确保分隔符是同一个字符), /lib\(64\)\?\(32\)\?/ld是一个正则表达式, \符号为转义字符, /ib/(64)?(32)?/ld. ()为创建一个用于匹配的子串, ?为匹配之前的项0次或者1次, 所以该表达式要匹配的字符串为/lib64/ld, /lib6432/ld, /lib32/ld, /tools&为替换部分,&表示在匹配的字符串加前缀还是后缀(这里就不是替换的意思了),如果替换的字符串在&字符之前,就表示加前缀, 之后则为加后缀 最后的g标志表示应用于找到的所有行*/
-e 's@/usr@/tools@g' $file.orig > $file /* 将/usr替换为/tools, 然后保存到linux.h等源文件, 这里其实也可以加-i参数表示直接修改文件并保存, 就不需要重定向这一步了 */
echo '
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 "/tools/lib/" /* 调整gcc函数库的搜索路径? */
#define STANDARD_STARTFILE_PREFIX_2 "" ' >> $file
touch $file.orig /* 更新linux.h.orig的时间戳,防止二次执行该脚本*/
done