从 ELF 二进制文件中删除部分的脚本

Posted

技术标签:

【中文标题】从 ELF 二进制文件中删除部分的脚本【英文标题】:Script to strip sections from ELF binaries 【发布时间】:2016-04-28 23:44:30 【问题描述】:

我需要对目录中的每个文件运行以下两个命令:

A) 第一个命令:

readelf -aW A_FILE | grep Machine

其中A_FILE 是特定文件的名称。

第一个命令的输出如下所示:

Machine:  <unknown>: 0xXXX

0xXXX 是一些十六进制数字。

B) 第二条命令

objcopy -I elf64-x86-64 -O elf64-x86-64 -R .source -R .llvmir -R .amdil --alt-machine-code=<Machine> A_FILE A_FILE.STRIPPED

其中&lt;Machine&gt; 是来自第一个命令的十六进制数字,A_FILE.STRIPPED 是来自objcopy 的输出文件的名称。 (STRIPPED 是任意的,可以是任何一段文字)

【问题讨论】:

应该将0x 包含在第二个命令中,还是只包含后面的十六进制数字? ...我还尝试将问题标题更新为少一点“为我写这个!”并表示脚本实际上做了什么,因为它所做的事情是与开发工具相关的,因此是主题性的。 :) 非常感谢,查尔斯。是的,0x 应该包含在第二个命令中。 好交易;包括0x 是它已经做的。顺便说一句——如果你对我建议的脚本有任何问题,你能把通过bash -x scriptname 运行它的输出粘贴到没有广告的地方吗? gist.github.com、ix.io 或类似的都可以。 当然。现在正在调试。 m_line 似乎是空的。 【参考方案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

【讨论】:

完美!再次感谢。

以上是关于从 ELF 二进制文件中删除部分的脚本的主要内容,如果未能解决你的问题,请参考以下文章

将整个ELF二进制文件转储为可读的标题和部分

007.链接器命令脚本LD文件教程

如何将文本文件的内容添加为 ELF 文件中的一个部分?

ELF文件加载与动态链接

ELF文件加载与动态链接

gcc 是不是有任何选项可以在 ELF 二进制文件中添加版本信息?