本文介绍了运行使用自定义 gcc 编译的应用程序时,动态链接器直接调用分段错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试创建一个在 Debian Jessie 上编译的可重定位(零依赖项)mongodb v4.0 版本,以便在 Debian Buster 上运行它.

I am trying to create a relocatable (zero dependencies) mongodb v4.0 build compiled on Debian Jessie to run it on Debian Buster.

Mongo 4 需要 gcc 5.5:

Mongo 4 requires gcc 5.5:

Checking if C++ compiler is GCC 5.3.0 or newer...no

Debian Jessie 有 gcc 4.9,所以我决定从源代码编译 gcc 5.5.0.

Debian Jessie has gcc 4.9, so I decided to compile gcc 5.5.0 from source for that.

然后遵循以下建议:单个上的多个 glibc 库主持人

我复制了所有引用的库

LD_LIBRARY_PATH=/drone/src/mongodb-4/build/mongodb-4/lib
ldd /drone/src/mongodb-4/build/mongodb-4/bin/mongod.bin
    linux-vdso.so.1 (0x00007ffff825d000)
    libcurl.so.4 => /drone/src/mongodb-4/build/mongodb-4/lib/libcurl.so.4 (0x00007f9c85cb7000)
    libresolv.so.2 => /drone/src/mongodb-4/build/mongodb-4/lib/libresolv.so.2 (0x00007f9c85aa0000)
    librt.so.1 => /drone/src/mongodb-4/build/mongodb-4/lib/librt.so.1 (0x00007f9c85898000)
    libdl.so.2 => /drone/src/mongodb-4/build/mongodb-4/lib/libdl.so.2 (0x00007f9c85694000)
    libstdc++.so.6 => /drone/src/mongodb-4/build/mongodb-4/lib/libstdc++.so.6 (0x00007f9c85318000)
    libm.so.6 => /drone/src/mongodb-4/build/mongodb-4/lib/libm.so.6 (0x00007f9c85017000)
    libgcc_s.so.1 => /drone/src/mongodb-4/build/mongodb-4/lib/libgcc_s.so.1 (0x00007f9c84e01000)
    libpthread.so.0 => /drone/src/mongodb-4/build/mongodb-4/lib/libpthread.so.0 (0x00007f9c84be4000)
    libc.so.6 => /drone/src/mongodb-4/build/mongodb-4/lib/libc.so.6 (0x00007f9c84839000)
    libidn.so.11 => /drone/src/mongodb-4/build/mongodb-4/lib/libidn.so.11 (0x00007f9c84605000)
    librtmp.so.1 => /drone/src/mongodb-4/build/mongodb-4/lib/librtmp.so.1 (0x00007f9c843e8000)
    libssh2.so.1 => /drone/src/mongodb-4/build/mongodb-4/lib/libssh2.so.1 (0x00007f9c841bf000)
    libssl.so.1.0.0 => /drone/src/mongodb-4/build/mongodb-4/lib/libssl.so.1.0.0 (0x00007f9c83f5e000)
    libcrypto.so.1.0.0 => /drone/src/mongodb-4/build/mongodb-4/lib/libcrypto.so.1.0.0 (0x00007f9c83b61000)
    libgssapi_krb5.so.2 => /drone/src/mongodb-4/build/mongodb-4/lib/libgssapi_krb5.so.2 (0x00007f9c83916000)
    libkrb5.so.3 => /drone/src/mongodb-4/build/mongodb-4/lib/libkrb5.so.3 (0x00007f9c83642000)
    libk5crypto.so.3 => /drone/src/mongodb-4/build/mongodb-4/lib/libk5crypto.so.3 (0x00007f9c83411000)
    libcom_err.so.2 => /drone/src/mongodb-4/build/mongodb-4/lib/libcom_err.so.2 (0x00007f9c8320d000)
    liblber-2.4.so.2 => /drone/src/mongodb-4/build/mongodb-4/lib/liblber-2.4.so.2 (0x00007f9c82ffe000)
    libldap_r-2.4.so.2 => /drone/src/mongodb-4/build/mongodb-4/lib/libldap_r-2.4.so.2 (0x00007f9c82dac000)
    libz.so.1 => /drone/src/mongodb-4/build/mongodb-4/lib/libz.so.1 (0x00007f9c82b91000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f9c89171000)
    libgnutls-deb0.so.28 => /drone/src/mongodb-4/build/mongodb-4/lib/libgnutls-deb0.so.28 (0x00007f9c8286b000)
    libhogweed.so.2 => /drone/src/mongodb-4/build/mongodb-4/lib/libhogweed.so.2 (0x00007f9c8263c000)
    libnettle.so.4 => /drone/src/mongodb-4/build/mongodb-4/lib/libnettle.so.4 (0x00007f9c8240a000)
    libgmp.so.10 => /drone/src/mongodb-4/build/mongodb-4/lib/libgmp.so.10 (0x00007f9c82187000)
    libgcrypt.so.20 => /drone/src/mongodb-4/build/mongodb-4/lib/libgcrypt.so.20 (0x00007f9c81ea5000)
    libkrb5support.so.0 => /drone/src/mongodb-4/build/mongodb-4/lib/libkrb5support.so.0 (0x00007f9c81c99000)
    libkeyutils.so.1 => /drone/src/mongodb-4/build/mongodb-4/lib/libkeyutils.so.1 (0x00007f9c81a95000)
    libsasl2.so.2 => /drone/src/mongodb-4/build/mongodb-4/lib/libsasl2.so.2 (0x00007f9c81879000)
    libp11-kit.so.0 => /drone/src/mongodb-4/build/mongodb-4/lib/libp11-kit.so.0 (0x00007f9c81633000)
    libtasn1.so.6 => /drone/src/mongodb-4/build/mongodb-4/lib/libtasn1.so.6 (0x00007f9c8141f000)
    libgpg-error.so.0 => /drone/src/mongodb-4/build/mongodb-4/lib/libgpg-error.so.0 (0x00007f9c8120d000)
    libffi.so.6 => /drone/src/mongodb-4/build/mongodb-4/lib/libffi.so.6 (0x00007f9c81004000)

我不得不使用我的 gcc 5 构建中的 libstdc++.so.*libgcc_s.so.*.

I had to use libstdc++.so.* and libgcc_s.so.* from my gcc 5 build.

此时一切正常:

/drone/src/mongodb-4/build/mongodb-4/bin/mongod --version
db version v4.0.21
git version: 3f68a848c68e993769589dc18e657728921d8367
allocator: tcmalloc
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64

但是当我尝试直接在 Jessie 上运行动态链接器(将它带到 Buster)时,我遇到了分段错误:

But when I try to run dynamic linker directly on Jessie (to bring it with me to Buster) I get a segmentation fault:

/lib64/ld-linux-x86-64.so.2 /drone/src/mongodb-4/build/mongodb-4/bin/mongod.bin --version
12465 Segmentation fault      (core dumped)

我做错了吗?

有什么办法可以调试吗?

Is there any way to debug it?

推荐答案

一段时间后我意识到,如果我尝试打包一个独立的构建,那么我应该可以在 Debian Buster 上进行(不需要自定义gcc) 然后把所有的库和链接器移到 Debian Jessie,效果很好.主要要求是拥有一个可以同时在 Jessie 和 Buster 上运行的构建版本.

After some time I realized that if I am trying to package a self-contained build then I should be fine doing it on Debian Buster (no need for a custom gcc) then take all the libs and linker and move it to Debian Jessie, that worked fine.Main requirement was to have a single build that works on both Jessie and Buster.

这篇关于运行使用自定义 gcc 编译的应用程序时,动态链接器直接调用分段错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-31 17:10