go - 如何确定 ELF 文件是否为 Go ELF 文件?
问题描述
我需要确定给定的 ELF 文件是否来自 Go。根据此链接:
$ readelf -a traefik.stripped | grep "\.note\.go\.buildid"
这是否以任何方式不如 Go 的原生方式:
$ go tool buildid traefik.stripped
oPIWoPjqt1P3rttpA3ee/ByNXPhvgS37nIoJY-HYB/8b25JYXrgktA-FYgU5MU/0Posfq41xZW9BEPEG4Ub
两种方法都可以保证在剥离的二进制文件上工作吗?
解决方案
我需要确定给定的 ELF 文件是否来自 Go
这是一般情况下不可能做到的。什么是和不是 Go 二进制文件没有很好的定义,一个充分优化的 Go 二进制文件最终可能只包含几条指令。例如x86_64
,您可能会得到一条HLT
指令。
为什么 strip 本身不会删除此部分?
该部分(实际上是每个部分)对于执行不是必需的——您可以删除所有部分,并且二进制文件仍然可以工作。
本节仅用于帮助开发人员识别特定构建。 默认情况下strip
不会删除它,因为这会破坏本节的目的,但它当然可以这样做。
一个无辜的 go 开发人员可以构建一个 golang ELF 并意外删除这个(冗余??)部分
当然。开发人员可以运行一个损坏的版本strip
,或者他可以使用别名strip
,strip --strip-all
或者他可以使用其他一些 ELF 后处理工具,或者他可以使用 UPX,或者......
推荐阅读
- wordpress - wordpress 自定义字段更新后禁止 403
- node.js - Heroku 使用 process.env.PORT 部署失败节点应用程序
- tensorflow - 具有同时 POS 标记和情感分类的 RNN?
- javascript - dropzone.js 删除点击上传
- javascript - Kraken API 无效签名
- java - Spring Data JPA / Hibernate - @Repository 中的 findByY(String y) 方法,其中 Y 可通过对象 X 访问
- javascript - 如何限制在剑道网格输入栏中输入特殊字符
- node.js - Mongoose 显示每个帖子的评论和星星(喜欢)
- f# - 使用 FParsec 解析分隔列表
- java - 休眠持久化与多对多关系的瞬态对象