首页 > 解决方案 > 如何确定 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

两种方法都可以保证在剥离的二进制文件上工作吗?

标签: goelfreadelf

解决方案


我需要确定给定的 ELF 文件是否来自 Go

这是一般情况下不可能做到的。什么是和不是 Go 二进制文件没有很好的定义,一个充分优化的 Go 二进制文件最终可能只包含几条指令。例如x86_64,您可能会得到一条HLT指令。

为什么 strip 本身不会删除此部分?

该部分(实际上是每个部分)对于执行不是必需的——您可以删除所有部分,并且二进制文件仍然可以工作。

本节用于帮助开发人员识别特定构建。 默认情况下strip不会删除它,因为这会破坏本节的目的,但它当然可以这样做。

一个无辜的 go 开发人员可以构建一个 golang ELF 并意外删除这个(冗余??)部分

当然。开发人员可以运行一个损坏的版本strip,或者他可以使用别名stripstrip --strip-all或者他可以使用其他一些 ELF 后处理工具,或者他可以使用 UPX,或者......


推荐阅读