我需要在目录中的每个文件上运行以下两个命令:
A)第一个命令:
@Modules
其中readelf -aW A_FILE | grep Machine
是特定文件的名称。
第一个命令的输出如下所示:
A_FILE
其中Machine: <unknown>: 0xXXX
是一些十六进制数。
B)第二个命令
0xXXX
其中objcopy -I elf64-x86-64 -O elf64-x86-64 -R .source -R .llvmir -R .amdil --alt-machine-code=<Machine> A_FILE A_FILE.STRIPPED
是第一个命令的十六进制数,<Machine>
是A_FILE.STRIPPED
的输出文件的名称。 (objcopy
是任意的,可以是任何一段文字)
答案 0 :(得分:1)
#!/bin/bash
# ^^^^- important, not /bin/sh
# define a regex, in ERE form, to extract the content you want in a match group
re='machine.*(0x[[:xdigit:]]{2,}) '
# iterate over files, putting each in $f
for f in *; do
# don't operate on files we previously generated
[[ $f = *.stripped ]] && continue
# actually run readelf, taking first matching line
m_line=$(readelf -aW "$f" | egrep -m 1 "$re")
[[ $m_line =~ $re ]] || continue # check whether we match the regex
# if we get here, the regex matched; copy the first match group into a variable
code=${BASH_REMATCH[1]}
# ...and use that variable in calling objcopy
objcopy -I elf64-x86-64 -O elf64-x86-64 -R .source -R .llvmir -R .amdil \
--alt-machine-code="$code" \
"$f" "$f.stripped"
done