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

 

posted @ 2024-12-21 09:40  刘宏缔的架构森林  阅读(6)  评论(0编辑  收藏  举报