如何覆盖动态链接的 libgcc_s 的位置?

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

我正在尝试在 Debian Bookworm 系统上构建一个可执行文件,以便在 Debian Bullseye 上运行。

我已在专用目录中下载并解压了 Bullseye 的库包以进行链接。

但是,尽管我将旧

libgcc_s.so
的位置添加到运行时路径中,但系统范围的版本仍然是首选。怎么了?

bodqhrohro@debian:~/git/td/build$ ldd tdutils/generate/generate_mime_types_gperf 
tdutils/generate/generate_mime_types_gperf: /home/bodqhrohro/git/glibc/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by tdutils/generate/generate_mime_types_gperf)
tdutils/generate/generate_mime_types_gperf: /home/bodqhrohro/git/glibc/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_ABI_DT_RELR' not found (required by /lib/x86_64-linux-gnu/libm.so.6)
tdutils/generate/generate_mime_types_gperf: /home/bodqhrohro/git/glibc/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.35' not found (required by /lib/x86_64-linux-gnu/libgcc_s.so.1)
tdutils/generate/generate_mime_types_gperf: /home/bodqhrohro/git/glibc/lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /lib/x86_64-linux-gnu/libgcc_s.so.1)
        linux-vdso.so.1 (0x00007fffc6be8000)
        libstdc++.so.6 => /home/bodqhrohro/git/libstdc++/usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fd49918c000)
        libc.so.6 => /home/bodqhrohro/git/glibc/lib/x86_64-linux-gnu/libc.so.6 (0x00007fd498fb8000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fd498ebd000)
        /home/bodqhrohro/git/glibc/lib64/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007fd499364000)
        libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fd498e9d000)
bodqhrohro@debian:~/git/td/build$ objdump -p tdutils/generate/generate_mime_types_gperf |grep RUNPATH
  RUNPATH              /home/bodqhrohro/git/glibc/lib/x86_64-linux-gnu:/home/bodqhrohro/git/libstdc++/usr/lib/x86_64-linux-gnu:/home/bodqhrohro/git/libgcc-s1/lib/x86_64-linux-gnu:/home/bodqhrohro/git/libssl/usr/lib/x86_64-linux-gnu
bodqhrohro@debian:~/git/td/build$ ls -l /home/bodqhrohro/git/libgcc-s1/lib/x86_64-linux-gnu/
total 100
-rw-r--r-- 1 bodqhrohro bodqhrohro 100736 Jan 10  2021 libgcc_s.so.1

我尝试使用

-static -Wl,-Bdynamic,-lgcc_s,-Bstatic
,这样编译会以某种方式成功,并且这个小型中间实用程序在同一系统上的构建过程中成功运行,但
ldd
显示它不是动态可执行文件。它真的是这样工作的吗?这种方法并不合适,因为主要可执行文件需要动态链接到 OpenSSL,而不是完全静态。

c++ gcc cross-compiling static-linking tdlib
1个回答
0
投票

在检查了

ldd
LD_DEBUG=all
调用后,我发现
libgcc_s.so.1
(以及
libm.so.6
)实际上是
libstdc++.so.6
所需要的,而它不受被覆盖的
rpath
的影响。使用
-static-libstdc++
进行编译有助于解决这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.