一、 提升运行环境的gcc版本
可以采用容器技术,将该程序部署到指定版本的ubuntu容器中执行
二、 降低编译环境的gcc版本
方案1:
通过CGO参数,可以指定gcc的版本。 不过这个前提是你需要在目标机器上把libc.so文件拷贝出来,然后复制到编译机器上。(注意:不要放置到系统路径下)
然后通过如下参数来编译
CGO_LDFLAGS='-g -O2 -Wl,-rpath=. -Wl, --dynamic-linker=ld-linux-x86-64.so.2'
CGO_CFLAGS="-L. -l/my/path/libc.so.6,/my/path/ld-linux-x86-64.so.2"
go build
其中-rpath是指运行时指定寻找libc.so的路径,请根据你的环境来修改。
编译完成后,通过ldd看以下依赖.
但是需要注意的是,如果依赖的二进制库也是依赖libc编译的,那么这些库可能也存在一样的依赖问题。所以这种情况只适合没有其他依赖库依赖cgo的情况。
验证
使用LD_PRELOAD可以加载与本机不同的libc来运行程序
LD_PRELOAD=/lib64/libc.so xxx
方案2:
同样采用容器化来部署相同的编译环境