https://blog.cloudflare.com/the-complete-guide-to-golang-net-http-timeouts/ https://colobu.com/2016/07/01/the-complete-guide-to-golang-net-http-timeouts/ 当用Go写HTTP的服务器和客户端的时候,超时处理总是最易犯错和最微妙的地方之一。错误可能来自很多地方,一个错误可能等待很长时间没有结果,直到网络故障或者进程挂起。
https://golang.org/cmd/cgo/ CFLAGS, CPPFLAGS, CXXFLAGS, FFLAGS and LDFLAGS may be defined with pseudo #cgo directives within these comments to tweak the behavior of the C, C++ or Fortran compiler. Values defined in multiple directives are concatenated together. The directive can include a list of build constraints limiting its effect to systems satisfying one of the constraints (see https://golang.org/pkg/go/build/#hdr-Build_Constraints for details about the constraint syntax). For example:
在某个项目需要支持多平台时,某个功能可能需要针对不同平台编写专属这个平台的具体实现。 在c/c++中,不同平台的实现或者某个平台的特性往往通过#if, #else, #endif这类预处理指令来配合 交叉编译达到。
go build编译时,CGO_ENABLED=1的,自动添加了一些动态库链接,所以编译时吧CGO_ENABLED=0就OK了 go 要求的编译工具gcc libc6-dev 一般系统都自带了如果没有自行安装。 Golang 程序如此大的一个原因是它全是静态链接的。如果能用到动态链接,可以让各个 Golang 程序共用一个标准库,大大减少 RAM 和 ROM 的使用 我尝试用 OpenWrt buildroot 编译带 Golang 支持的 GCC,在解决几个编译错误后终于编译出 gccgo 和 libgo.so 共享标准库 结果用 gccgo 编译 helloworld 时,在链接时找不到几个 setcontext 等符号,查了下才发现 musl libc 没有实现 ucontext…… 得,又在 GitHub 上找了个 https://github.com/kaniini/libucontext (暂时没有 MIPS),编译好后在 gccgo 加上参数 -lucontext 终于不报错了,程序大小只有 10kB 把程序和几个共享库传到我的 ARM 上,ldd 好像没有问题
Linux的用C库的都是glibc,有一个叫libc.so.6的文件,这是几乎所有Linux下命令的动态链接中,其中有标准C的各种函数,默认情况下,linux所编译的程序中对标准C函数的链接,都是通过动态链接方式来链接libc.so.6这个函数库的。这也意味着我们在通过我们注入的.so来实现函数覆盖劫持之后需要从libc.so.6中取得原本的正常函数,让程序继续正常执行
#include