首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在执行时强制使用特定库

在执行时强制使用特定库
EN

Stack Overflow用户
提问于 2017-06-22 15:51:36
回答 1查看 162关注 0票数 2

我编译了一个可执行文件,可以选择使用特定库(而不是系统库)。编译正常。

但是当我执行这个二进制文件时,尽管指定了指向这些特定库的LD_LIBRARY_PATH,但我在libc上发现了一个关于找到错误的glib版本的错误:

代码语言:javascript
运行
复制
./bin: /lib/i386-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libglib-2.0.so.0)

这是正常的,因为可执行文件使用系统libc而不是特定的libc...可执行文件上的ldd显示问题:

代码语言:javascript
运行
复制
[user ~/Desktop/gesram_x86 ] ldd -v bin 
./bin: /lib/i386-linux-gnu/libc.so.6: version `GLIBC_2.17' not found (required by /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libglib-2.0.so.0)
    linux-gate.so.1 =>  (0xb7704000)
    libgesram.so.0 => /home/user/Desktop/gesram_x86/gesram/lib_gesram/.libs/libgesram.so.0 (0xb76f9000)
    libsofutils.so.0 => /home/user/ptxdist/platform-i586/sysroot-target/applications/base/lib/libsofutils.so.0 (0xb76f1000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb7531000)
    libglib-2.0.so.0 => /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libglib-2.0.so.0 (0xb7403000)
    libgio-2.0.so.0 => /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libgio-2.0.so.0 (0xb721b000)
    libgobject-2.0.so.0 => /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libgobject-2.0.so.0 (0xb71bc000)
    libffi.so.6 => /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libffi.so.6 (0xb71b3000)
    libpcre.so.1 => /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libpcre.so.1 (0xb713b000)
    libgmodule-2.0.so.0 => /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libgmodule-2.0.so.0 (0xb7137000)
    libz.so.1 => /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libz.so.1 (0xb711c000)
    librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0xb7112000)
    libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb70f6000)
    /lib/ld-linux.so.2 (0xb7705000)
    libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb70f1000)

    Version information:
    ./bin:
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
    /home/user/Desktop/gesram_x86/gesram/lib_gesram/.libs/libgesram.so.0:
        libpthread.so.0 (GLIBC_2.0) => /lib/i386-linux-gnu/libpthread.so.0
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
    /home/user/ptxdist/platform-i586/sysroot-target/applications/base/lib/libsofutils.so.0:
        librt.so.1 (GLIBC_2.2) => /lib/i386-linux-gnu/librt.so.1
        libpthread.so.0 (GLIBC_2.0) => /lib/i386-linux-gnu/libpthread.so.0
        libc.so.6 (GLIBC_2.3.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.8) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
    /lib/i386-linux-gnu/libc.so.6:
        ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
        ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
        ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
    /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libglib-2.0.so.0:
        libpthread.so.0 (GLIBC_2.12) => /lib/i386-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.2) => /lib/i386-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.1) => /lib/i386-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.0) => /lib/i386-linux-gnu/libpthread.so.0
        libc.so.6 (GLIBC_2.9) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.11) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.8) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.7) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.15) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.17) => not found
        libc.so.6 (GLIBC_2.1.2) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/i386-linux-gnu/libc.so.6
    /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libgio-2.0.so.0:
        libz.so.1 (ZLIB_1.2.2) => /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libz.so.1
        libpthread.so.0 (GLIBC_2.2) => /lib/i386-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.0) => /lib/i386-linux-gnu/libpthread.so.0
        libc.so.6 (GLIBC_2.9) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1.2) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.12) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.14) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.5) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
    /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libgobject-2.0.so.0:
        libc.so.6 (GLIBC_2.3.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
    /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libffi.so.6:
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.7) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
    /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libpcre.so.1:
        libpthread.so.0 (GLIBC_2.0) => /lib/i386-linux-gnu/libpthread.so.0
        libc.so.6 (GLIBC_2.3.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3) => /lib/i386-linux-gnu/libc.so.6
    /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libgmodule-2.0.so.0:
        libpthread.so.0 (GLIBC_2.0) => /lib/i386-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.2) => /lib/i386-linux-gnu/libpthread.so.0
        libdl.so.2 (GLIBC_2.1) => /lib/i386-linux-gnu/libdl.so.2
        libdl.so.2 (GLIBC_2.0) => /lib/i386-linux-gnu/libdl.so.2
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
    /home/user/ptxdist/platform-i586/sysroot-target/usr/lib/libz.so.1:
        libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.4) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.3.4) => /lib/i386-linux-gnu/libc.so.6
    /lib/i386-linux-gnu/librt.so.1:
        libpthread.so.0 (GLIBC_2.1) => /lib/i386-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_PRIVATE) => /lib/i386-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.0) => /lib/i386-linux-gnu/libpthread.so.0
        libpthread.so.0 (GLIBC_2.2) => /lib/i386-linux-gnu/libpthread.so.0
        libc.so.6 (GLIBC_2.3.2) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
    /lib/i386-linux-gnu/libpthread.so.0:
        ld-linux.so.2 (GLIBC_2.1) => /lib/ld-linux.so.2
        ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
        ld-linux.so.2 (GLIBC_2.3) => /lib/ld-linux.so.2
        libc.so.6 (GLIBC_2.3.2) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_PRIVATE) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.2) => /lib/i386-linux-gnu/libc.so.6
    /lib/i386-linux-gnu/libdl.so.2:
        ld-linux.so.2 (GLIBC_PRIVATE) => /lib/ld-linux.so.2
        libc.so.6 (GLIBC_PRIVATE) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1.3) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.1) => /lib/i386-linux-gnu/libc.so.6
        libc.so.6 (GLIBC_2.0) => /lib/i386-linux-gnu/libc.so.6

所有指向/lib//usr/lib/库的链接都是错误的...

以下是我的编译命令:

代码语言:javascript
运行
复制
/opt/OSELAS.Toolchain-2016.06.0/toolchain-i586/bin/i586-unknown-linux-gnu-gcc -o bin fichier.c -I/home/user/include -I/home/usr/ptxdist/platform-i586/sysroot-target/usr/include/glib-2.0/ -Wl,-rpath,gesram/lib_gesram/.libs/ -Lgesram/lib_gesram/.libs/ -lgesram -Wl,-rpath,/home/user/ptxdist/platform-i586/sysroot-target/applications/base/lib/ -L/home/user/ptxdist/platform-i586/sysroot-target/applications/base/lib/ -lsofutils -Wl,-rpath,/opt/OSELAS.Toolchain-2016.06.0/toolchain-i586/sysroot-i586-unknown-linux-gnu/usr/lib/ -L/opt/OSELAS.Toolchain-2016.06.0/toolchain-i586/sysroot-i586-unknown-linux-gnu/usr/lib/ -lc -Wl,-rpath,/home/user/ptxdist/platform-i586/sysroot-target/usr/lib/ -L/home/user/ptxdist/platform-i586/sysroot-target/usr/lib/ -lglib-2.0 -lgio-2.0 -lgobject-2.0 -lffi -lpcre -lgmodule-2.0 -lz

这是一种在执行时强制使用特定库的方法吗?

这是LD_DEBUG=all ./bin输出的一部分(感谢Ctx):

代码语言:javascript
运行
复制
 24006: file=libc.so.6 [0];  needed by ./bin [0]
 24006: find library=libc.so.6 [0]; searching
 24006:  search path=/home/ggau/Desktop/gesram_x86/gesram/lib_gesram/.libs:/home/ggau/integration/ptxdist/platform-i586/sysroot-target/applications/base/lib:/opt/OSELAS.Toolchain-2016.06.0/toolchain-i586/sysroot-i586-unknown-linux-g
    [...]
 24006:   trying file=/opt/OSELAS.Toolchain-2016.06.0/toolchain-i586/sysroot-i586-unknown-linux-gnu/lib/sse2/libc.so.6
 24006:   trying file=/opt/OSELAS.Toolchain-2016.06.0/toolchain-i586/sysroot-i586-unknown-linux-gnu/lib/cmov/libc.so.6
 24006:   trying file=/opt/OSELAS.Toolchain-2016.06.0/toolchain-i586/sysroot-i586-unknown-linux-gnu/lib/libc.so.6
 24006:  search cache=/etc/ld.so.cache
 24006:   trying file=/lib/i386-linux-gnu/libc.so.6
 24006: 
 24006: file=libc.so.6 [0];  generating link map
 24006:   dynamic: 0xb77a4d7c  base: 0xb75fd000   size: 0x001abadc
 24006:     entry: 0xb7616690  phdr: 0xb75fd034  phnum:         10

我不明白为什么可执行文件不使用这个文件/opt/OSELAS.Toolchain-2016.06.0/toolchain-i586/sysroot-i586-unknown-linux-gnu/lib/libc.so.6,因为它是好文件……

代码语言:javascript
运行
复制
lrwxrwxrwx 1 root root 12 May 31 17:45 /opt/OSELAS.Toolchain-2016.06.0/toolchain-i586/sysroot-i586-unknown-linux-gnu/lib/libc.so.6 -> libc-2.23.so*

它在尝试/lib/i386-linux-gnu/libc.so.6之前尝试此文件...

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-22 16:59:07

简而言之,如果不提供您自己的GLIBC原生动态链接器,就不能强制应用程序使用您自己的GLIBC。

64位:

代码语言:javascript
运行
复制
-Wl,--rpath=<path to glibc 64-bit libs>
-Wl,--dynamic-linker=<path to glibc 64-bit libs>/ld-linux-x86-64.so.2

32位:

代码语言:javascript
运行
复制
-Wl,--rpath=<path to glibc 32-bit libs>
-Wl,--dynamic-linker=<path to glibc 32-bit libs>/ld-linux.so.2
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44693360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档