go - Go:使用 PIE 编译成静态二进制文件
问题描述
我正在寻找一个可以在没有链接的环境中执行的二进制文件,但也可以在链接器可用但需要 PIE 的环境中执行。
我得到的关闭是链接器声明它是静态链接但“文件”仍然说它是动态二进制文件的地方。
有没有办法获得一个对链接器没有外部依赖并且不是 LSB 共享对象的二进制文件?
go1.15.2 示例:
% echo "package main;import \"fmt\";func main() {fmt.Println(\"Simple Example\")}" > main.go
% GOOS=linux go build -ldflags "-linkmode=internal -s -w" -buildmode=pie -o mainProc main.go
% ldd mainProc
statically linked
% file mainProc
mainProc: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, Go BuildID=8mM4GRs9zxgrVjDRg2Ch/efne9QJbJLpmKT6hRtJm/JWUYVr1m9OhJoV0v1uwq/1IZdDT8CvBOOywiI8eQq, stripped
解决方案
解决了它:
go build -ldflags '-linkmode external -s -w -extldflags "--static-pie"' -buildmode=pie -tags 'osusergo,netgo,static_build' -o /hello hello.go
推荐阅读
- azure - 如何获取 azure blob 的复制状态
- java - 在 JTextPane 中转换为大写或小写时,文本样式和格式正在发生变化
- mysql - 从 MYSQL 中删除超过 X 天的数据,Unix 时间以毫秒为单位
- php - 无法在 1.7.4.3 上删除产品组合
- ios - 可能丢失钥匙串访问权限
- javascript - 无法在 PDFjs 中为 pdf.worker.js 指定自定义路径
- angularjs - AngularJS 加载资源失败:服务器响应状态为 403 ()
- thingsboard - Thingboard:从内部数据库获取资产 ID
- ip - 如何在区块链上建立网站以防止其在某些国家/地区被封锁?
- function - 谷歌云功能和在谷歌云上的虚拟机上运行的网络服务有什么区别?