From a55c3a1ecd5216c13eddd55877bdab322fedbf8f Mon Sep 17 00:00:00 2001 From: weic Date: Thu, 11 Apr 2024 17:54:21 +0800 Subject: [PATCH] 1 --- docs/study/docker/index.md | 4 ++ docs/study/program/Golang/index.md | 71 +++++++++++++++++++ .../\347\274\226\350\257\221\345\231\250.md" | 10 +++ 3 files changed, 85 insertions(+) diff --git a/docs/study/docker/index.md b/docs/study/docker/index.md index e2b91291a..4c157a3aa 100644 --- a/docs/study/docker/index.md +++ b/docs/study/docker/index.md @@ -22,6 +22,10 @@ sidebar_position: 1 - [docker cli 官方参考文档](https://docs.docker.com/reference/cli/docker/) +### docker engine api + +- [docker engine api v1.45 官方参考文档](https://docs.docker.com/engine/api/v1.45/) + ### docker 官方镜像库 docker hub - [docker hub](https://hub.docker.com/) diff --git a/docs/study/program/Golang/index.md b/docs/study/program/Golang/index.md index 23c1469d2..ee670db69 100644 --- a/docs/study/program/Golang/index.md +++ b/docs/study/program/Golang/index.md @@ -55,3 +55,74 @@ ### GC - [知乎-Golang 内存管理之 GC](https://zhuanlan.zhihu.com/p/593008674?utm_id=0) + +### 安全编译 + +在Go语言中,“安全编译”可能指的是使用安全的编译参数,以确保代码的安全性和性能最优。这通常涉及到使用编译器的各种安全和性能参数,比如: + +使用 -s 或 -w 参数来减少编译后的二进制文件大小,去掉调试信息和符号信息。 + +使用 -ldflags 来设置链接器的标志,比如 -s -w 来进一步优化编译结果。 + +使用 -buildmode 参数来指定编译模式,比如 pie 来生成位置无关的可执行文件,增加安全性。 + +下面是一个简单的例子,演示如何使用 -ldflags 来优化编译结果: + +go build -ldflags "-s -w" -o myapp . + +这条命令会编译当前目录下的Go代码,并输出一个没有调试信息、符号和优化过的、体积更小的可执行文件 myapp。 + +如果你想进一步确保安全性,可以使用Go的安全性标志,比如 -tags safe,这取决于你使用的第三方库是否支持这个tag。 + +go build -tags safe -o myapp . + +请注意,每个项目可能有特定的安全和性能要求,因此编译参数应根据具体情况选择和调整。 + +```shell +# +go build -ldflags "-s -w -buildmode=pie -linkmode external -extldflags=-Wl,-z,relro,-z,now" -o CcspUtilRemote-`uname -m` +# +go build -tags safe -o myapp . +# 使用此命令查看 +go tool link --help +``` + +实际问题例子: + +```shell +# 安全编译检查 出现两个问题 [STACK CANARY/FORTIFY] +checksec --file=./xxx-x86_64 +# 处理[STACK CANARY/FORTIFY] 增加CGO 以及CGO代码文件cgo_safe.go +CGO_ENABLED=1 CGO_CFLAGS="-fstack-protector-all -D_FORTIFY_SOURCE=2 -O" go build -ldflags "-s -w -buildmode=pie -linkmode external -extldflags=-Wl,-z,relro,-z,now" -o xxx-`uname -m` +``` + +cgo_safe.go + +```go +package main + +import "C" +import "fmt" + +func init() { + s := C.CString("hello") + fmt.Println(s) + +} + +``` + +### 跨平台编译 + +具体操作 + +编译跨平台的只需要修改GOOS、GOARCH、CGO_ENABLED三个环境变量即可 + +- GOOS:目标平台的操作系统(darwin、freebsd、linux、windows) +- GOARCH:目标平台的体系架构32位还是64位(386、amd64、arm) +- 交叉编译不支持 CGO 所以要禁用它 + +### CGO + +- [CGO:让Go程序调用C函数的神器](https://blog.csdn.net/qq_42538588/article/details/131167683) +- [go语言调用c语言动态库及交叉编译](https://blog.csdn.net/weixin_43128854/article/details/122956384) \ No newline at end of file diff --git "a/docs/study/program/\347\274\226\350\257\221\345\231\250.md" "b/docs/study/program/\347\274\226\350\257\221\345\231\250.md" index 30708d383..755adb590 100644 --- "a/docs/study/program/\347\274\226\350\257\221\345\231\250.md" +++ "b/docs/study/program/\347\274\226\350\257\221\345\231\250.md" @@ -11,3 +11,13 @@ GCC 是老牌的 C/C++编译器,主要由 GNU 维护,Linux 系统默认的 LLVM 是比较新的编译器架构系统,CLang 是基于 LLVM 的 C/C++/CLang 编译器,产生 CLang 的原因是 Apple 公司想开发新的语言 CLang,以及对 GCC 有其他特殊需求,但是 GCC 配合的并不是很好,所以才造了个新轮子。 Microsoft Visual C++是 Windows 系统的编译器。 + +- [C/C++编译链接](https://zhuanlan.zhihu.com/p/88255667) + +### 编译过程 + +- 源文件(.c .cpp .h) +- 预处理(.i .ii) +- 编译(单个文件)(.s) +- 汇编(.o .obj) +- 链接(.exe ELF)