Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何检查golang二进制文件是否使用-ld频标=“-s -w”编译

如何检查golang二进制文件是否使用-ld频标=“-s -w”编译
EN

Stack Overflow用户
提问于 2017-05-23 19:28:16
回答 1查看 3.1K关注 0票数 6

我知道--ldflags="-s -w"会使Go二进制文件的大小更小,但是如果不与没有do标志的二进制进行比较,我们如何知道使用ldflags="-s -w"编译的Go二进制文件呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-24 13:40:28

免责声明:我不是编译工具链和可执行文件格式的专家。我尽量不要说蠢话,但如果你看到任何错误,请纠正我!

我在ArchLinux笔记本电脑上运行了这些测试,使用的是x86_64架构。Go版本为1.8.1。

首先,我们需要知道这些标志在哪里被实际使用:

代码语言:javascript
运行
AI代码解释
复制
$ go help build
...
-ldflags 'flag list'
    arguments to pass on each go tool link invocation
...

显然,标志只是传递给go tool link调用。看看帮助,我们有一些更多的信息:

代码语言:javascript
运行
AI代码解释
复制
$ go tool link
...
-s  disable symbol table
...
-w  disable DWARF generation
...

摘自对ELF的简短介绍,我发现了这里,这里是有关符号表的标题文本:

对象文件的符号表包含定位和重新定位程序的符号定义和引用所需的信息。

至于侏儒,这是一种调试数据的格式。

从那里,我们如何知道二进制是否有符号表,或侏儒启用?答案在于ELF部分。也许还有其他的方法,但这是我发现的,而且很容易检查。下面是我用来确定Golang二进制文件是用-ldflags='-s'还是-ldflags='-w'编译的规则

  • 如果Go二进制文件有符号表,则会出现节.symtab
  • 如果Go二进制文件具有矮小调试,则会出现节.debug_info。本节并不是唯一在场的部分,而是作为一个指标。

在Linux上,有一些工具可以读取节名来提取这些信息。readelfnm就是例子,但可能更多。

另外,Go还提供了一个debug/elf包,可以用来获取这些信息。下面是一个完成此工作的示例程序:

代码语言:javascript
运行
AI代码解释
复制
package main

import "fmt"
import "os"
import "debug/elf"

func main() {
    fileName := "path/to/main"
    fp, err := elf.Open(fileName)
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
    }

    symtab := fp.Section(".symtab")
    if symtab == nil {
        fmt.Println("No Symbol Table : compiled with -ldflags='-s'")
    }

    debugInfo := fp.Section(".debug_info")
    if debugInfo == nil {
        fmt.Println("No DWARF data : compiled with -ldflags='-w'")
    }
}

我在基本的Golang上测试了这个程序,没有使用标志,只使用-s标志,只使用-w标志和-s -w标志。我注意到,在仅用-s编译时,它也删除了矮小数据,但我没有搜索原因。除此之外,结果与预期的一样。

虽然ELF是焦点格式,但同样的方法可以应用于Windows可执行文件(在Golang中有一个debug/pe包)。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44148449

复制
相关文章
频标比对测量系统的使用介绍
一个优良的时间频率测量系统,应该是测量仪器的高分辨率和频率标准参考的准确度等级要高,二者匹配达到测量的高精度、误差小是根据检规的要求,用频差倍增法进行频标参数测试;为保证测试数据的可靠性,参考频标指标应优于被测频标指标一个数量级。
时频专家
2021/07/31
1K0
频标比对测量系统的使用介绍
Maven编译跳过测试文件检查
最近在使用Maven package一个项目,准备部署到生产,但是部署一直报错,提示信息:
SmileNicky
2022/05/25
1.1K0
Maven编译跳过测试文件检查
【说站】如何检查文件是否有Python的符号链接?
2、使用is_symlink()方法时必须小心。只要命名对象是符号链接,即使链接的目标不存在,它也会返回True。
很酷的站长
2022/11/24
3K0
【说站】如何检查文件是否有Python的符号链接?
golang 判断文件/路径是否存在、是否为文件夹/文件
golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断:
IT工作者
2022/07/01
3K0
shell脚本 检查文件是否被修改
1.进行检测目录的添加,可以多个目录 2.添加定时任务,可以一分钟一次,有改动会输出改动情况 #!/bin/bash #2020-3-14 #监测文件是否被修改脚本 #监测目录 dir_file=(/etc) file_list=/usr/local/file_list.txt error_file=/usr/local/error_list.txt display_path() { for i in `ls` do if [[ -d $i ]];then             cd $i    
陈不成i
2021/06/23
2.4K0
Golang 判断是否为 zip 文件
ZIP 由 Phil Katz 于 1989 年设计,所以在文件头中我们可以看到 PK 的字样,这就是 Phil Katz 大名的首字母缩写。
恋喵大鲤鱼
2022/12/18
1.4K0
知识分享之Golang——基于Golang的文件夹是否存在、文件是否存在函数
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。
cn華少
2022/06/08
1.3K0
powershell:脚本中检查mingw-w64编译器是否能生成 32/64位代码
10km
2018/01/03
9780
[转载]Golang 编译成 DLL 文件
首先撰写 golang 程序 exportgo.go: package main import "C" import "fmt" //export PrintBye func PrintBye() { fmt.Println("From DLL: Bye!") } //export Sum func Sum(a int, b int) int { return a + b; } func main() { // Need a main function to make CGO
李海彬
2018/03/16
2.3K0
如何使用 Python 检查两个列表是否反向相等?
在 Python 中使用列表时,在某些情况下,您可能需要比较两个列表是否反向相等。这意味着一个列表中的元素与另一个列表中的元素相同,但顺序相反。在 Python 中,我们可以使用反转和比较列表、使用 zip() 函数、将列表转换为字符串等方法检查两个列表是否反向相等。在本文中,我们将了解这些方法,并借助各种示例检查两个列表是否反向相等。
很酷的站长
2023/08/11
4150
如何使用 Python 检查两个列表是否反向相等?
golang fyne 使用中文并打包进二进制文件
1. 首先安装官方的cmd工具 go get fyne.io/fyne/cmd/fyne 验证: fyne 2. 准备好有效的字体文件(.ttf) 3.将字体文件转为go文件 fyne bundle Alibaba-PuHuiTi-Medium.ttf > bundle.go 4. 自动写入头 (head 命令是linux命令,win下需要在git bash中调用) head -n 9 bundle.go //文件 bundle.go (文件中无此句) // auto-generated // Co
余生
2021/03/02
3.3K0
RedHat 8 如何检查端口是否联通
其中可能有各种原因导致端口没有联通,通常为操作系统本身的防火墙,托管服务器中心的防火墙等。
HoneyMoose
2021/09/04
2.4K0
RedHat 8 如何检查端口是否联通
如何检查linux是否安装了php
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/113426.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/07
4.5K0
如何检查linux是否安装了php
KubeLinter:如何检查K8s清单文件和Helm图表
该开源工具可以分析Kubernetes YAML文件和Helm 图表,以确保它们遵循最佳实践,重点关注生产就绪性和安全性。以下是如何设置和使用它。 KubeLinter是一款开源工具,可分析 Kubernetes YAML 文件和 Helm 图表,以确保它们遵循最佳实践,重点关注生产就绪性和安全性。它对配置的各个方面进行检查,以识别潜在的安全错误配置和DevOps最佳实践。 通过运行 KubeLinter,您可以获得有关Kubernetes配置文件和 Helm 图表的有价值的信息。它可以帮助团队在开发过程的早期检测并解决安全问题。KubeLinter 执行的检查的一些示例包括以非 root 用户身份运行容器、强制执行最小权限以及通过仅将敏感信息存储在机密中来正确处理敏感信息。
DevOps云学堂
2023/08/22
2960
KubeLinter:如何检查K8s清单文件和Helm图表
golang判断文件或文件夹是否存在
golang判断文件或文件夹是否存在的方法为使用os.Stat()函数返回的错误值进行判断: 如果返回的错误为nil,说明文件或文件夹存在 如果返回的错误类型使用os.IsNotExist()判断为true,说明文件或文件夹不存在 如果返回的错误为其它类型,则不确定是否在存在 func PathExists(path string) (bool, error) { _, err := os.Stat(path) if err == nil {
李海彬
2018/03/19
5.7K0
C++代码编译时出现 ld: symbol(s) not found for architecture x86_64错误
上面错误时,一般是因为使用C的front-end去编译C++代码。使用gcc编译C++代码,它没有链接C++的liberies.例如:
EltonZheng
2021/01/22
12.5K0
linux 检查文件的CRC是否正确 命令:cksum
cksum命令是检查文件的CRC是否正确,确保文件从一个系统传输到另一个系统的过程中不被损坏。这种方法要求校验和在源系统中被计算出来,在目的系统中又被计算一次,两个数字进行比较,如果校验和相等,则该文件被认为是正确传输了。
用户7639835
2021/10/13
3.1K0
如何检查 Android 设备是否支持 Widevine DRM
想知道您的 Android 设备是否可以流式传输来自 Netflix 和 Amazon Prime Video 的高清视频?这是检查 Widevine DRM 支持的方法!
天天Lotay
2023/10/15
3.2K0
如何检查 Android 设备是否支持 Widevine DRM
注册前如何检查域名是否违规过
如果域名前主人用域名做坏事被拦截了,拦截信息并不会在新注册后被自动消除,而是需要手动拨打申述电话申述解除,比较麻烦。
kr
2022/09/28
4.4K0
注册前如何检查域名是否违规过
点击加载更多

相似问题

使用Bazel支持g频标编译glog失败

10

检查Golang中是否存在二进制文件

10

调试-X ld频标的问题

12

Golang:如何检查文件是否是使用Golang的窗口上的快捷文件?

17

如何通过使用golang来检查是否存在web文件?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档