在较新的Linux上启动时,基于CentOS 6 x64构建的32位版本的应用程序在`dl_iterate_phdr`中的异常期间崩溃。

问题描述 投票:1回答:1

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-gateld-linux并非完全是库,因此无法部署;
  • libdllibrtlibmlibpthreadlibcGLIBC的一部分,因此也不应部署它们(尤其是考虑到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
我可以在这里看到两个可能的选项:

    32位版本有一些问题(尽管它可以正常工作);
  1. 我对此事确实有很大的误解。
  2. 有什么想法吗?

TL; DR;我的研究表明,如果我在较旧的Linux(例如CentOS 6(带有GLIBC 2.12))上构建应用程序(及其依赖项),那么它应该可以在任何其他Linux发行版上完美运行,这是...

c++ linux exception glibc
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.