TL; DR;
我的研究表明,如果像CentOS 6
(带有GLIBC 2.12
)一样在较旧的Linux上构建应用程序(及其依赖项),则应该可以在其他任何Linux发行版上正常运行,其具有更新的GLIBC
。这个假设不正确吗?这里是
build
机器:$ rpm -q centos-release
centos-release-6-10.el6.centos.12.3.x86_64
$ ldd --version
ldd (GNU libc) 2.12
$ ld -v
GNU ld version 2.30-54.el6
$ gcc --version
gcc (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3)
$ g++ --version
g++ (GCC) 8.3.1 20190311 (Red Hat 8.3.1-3)
几乎静态链接所有内容,因此:application
$ ldd ./app
linux-gate.so.1 (0xf7f73000)
libdl.so.2 => /lib32/libdl.so.2 (0xf7f4c000)
librt.so.1 => /lib32/librt.so.1 (0xf7f41000)
libstdc++.so.6 => ./libstdc++.so.6 (0xf7e22000)
libm.so.6 => /lib32/libm.so.6 (0xf7d53000)
libgcc_s.so.1 => ./libgcc_s.so.1 (0xf7d35000)
libpthread.so.0 => /lib32/libpthread.so.0 (0xf7d14000)
libc.so.6 => /lib32/libc.so.6 (0xf7b36000)
/lib/ld-linux.so.2 (0xf7f75000)
所以:
linux-gate
和ld-linux
并非完全是库,因此无法部署;libdl
,librt
,libm
,libpthread
和libc
是GLIBC
的一部分,因此也不应部署它们(尤其是考虑到GNU C库的向后兼容性) );libstdc++
和libgcc_s
与二进制文件一起被“部署”(从构建计算机中获取)test
$ lsb_release -a
Description: Debian GNU/Linux 10 (buster)
$ ldd --version
ldd (Debian GLIBC 2.28-10) 2.28
[64位版本(带有libstdc++
和libgcc_s
)似乎工作得很好。
问题出在32位版本上-它
崩溃
,当引发异常时(不是所有异常,但似乎是一致的)。这是堆栈跟踪的有趣之处: SIGSEGV at 0# __kernel_sigreturn in linux-gate.so.1
1# dl_iterate_phdr in /lib32/libc.so.6
2# _Unwind_Find_FDE in ./libgcc_s.so.1
3# 0xF7D88AAE in ./libgcc_s.so.1
4# 0xF7D89227 in ./libgcc_s.so.1
5# _Unwind_RaiseException in ./libgcc_s.so.1
6# __cxa_throw in ./libstdc++.so.6
7# <some funct> in ./app
7# <some funct> in ./app
7# <some funct> in ./app
7# <some funct> in ./app
7# <some funct> in ./app
7# <some funct> in ./app
13# make_fcontext in ./app
我可以在这里看到两个可能的选项:
TL; DR;我的研究表明,如果我在较旧的Linux(例如CentOS 6(带有GLIBC 2.12))上构建应用程序(及其依赖项),那么它应该可以在任何其他Linux发行版上完美运行,这是...