golang: 应用运行时报错:/lib64/libc.so.6: version `GLIBC_2.32' not found
一,报错信息
在服务端运行编译好的二进制代码时报错:
./binapp: /lib64/libc.so.6: version `GLIBC_2.32' not found (required by ./binapp)
这个是因为打包的开发环境与线上部署的运行环境之间系统核心包libc版本有差异
二,查看libc的版本:
线下:
$ ldd --version
ldd (Ubuntu GLIBC 2.33-0ubuntu5) 2.33
Copyright (C) 2021 自由软件基金会。
这是一个自由软件;请见源代码的授权条款。本软件不含任何没有担保;甚至不保证适销性
或者适合某些特殊目的。
由 Roland McGrath 和 Ulrich Drepper 编写。
线上:
# ldd --version
ldd (GNU libc) 2.28
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
可以看到因为线上环境的libc的版本过低,导致go程序运行时报错
查看自己的应用是否使用了外部依赖
$ ldd binapp
linux-vdso.so.1 (0x00007ffcfcbe4000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007fcbf8be5000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fcbf8bc3000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fcbf89d7000)
/lib64/ld-linux-x86-64.so.2 (0x00007fcbf8c19000)
确实使用了外部依赖
三,解决:
1, 第一种方法就是在docker中换用高版本libc库的镜像
2, 第二种方法就是独立打包,
我们试用一下这个方法:
$ go build -ldflags '-linkmode "external" -extldflags "-static"'
# binapp
/usr/bin/ld: /tmp/go-link-1679187848/000004.o: in function `_cgo_04fbb8f65a5f_C2func_getaddrinfo':
/tmp/go-build/cgo-gcc-prolog:60: 警告: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
有一个警告信息,
应该是用到的一个获取ip地址的方法在运行时仍然需要glibc动态库
再次测试是否使用了外部依赖?
$ ldd binapp
不是动态可执行文件
已经不再需要外部依赖
3,独立打包的命令之二:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -tags netgo -ldflags '-w -extldflags "-static"' -o your_binary
时间比较长,但没有报错信息,应该把相应的库编译到了二进制文件内部
说明:-a
标志表示重新构建所有的依赖项,
-tags netgo
用来排除cgo对net包的影响,
-ldflags
选项后面的参数则是告诉链接器输出静态链接的二进制文件。
四,其他报错信息
如果报错如下:
# command-line-arguments
/usr/local/go/pkg/tool/linux_amd64/link: running gcc failed: exit status 1
/usr/bin/ld: cannot find -lpthread
collect2: ld returned 1 exit status
表示缺少glibc-static库
解决:
yum install glibc-static -y