为什么相同的可执行文件在不同的位置加载了不同的libc.so

da_miao_zi

我将一个简单的C(仅包含一个空的main函数)文件编译到a.out中,并在不同的位置运行它:

user@host:~$ md5sum /home/work/a.out /tmp/a.out
dcbdb836569b99a7dc83366ba9bb3588  /home/work/a.out
dcbdb836569b99a7dc83366ba9bb3588  /tmp/a.out
user@host:~$
user@host:~$
user@host:~$ ldd /home/work/a.out
    linux-vdso.so.1 (0x00007fffe11fa000)
    libc.so.6 => /opt/compiler/gcc-4.8.2/lib/libc.so.6 (0x00007f42b8bca000)    <--
    /opt/compiler/gcc-4.8.2/lib64/ld-linux-x86-64.so.2 (0x00007f42b8f77000)
user@host:~$
user@host:~$ ldd /tmp/a.out
    linux-vdso.so.1 (0x00007fff6ba41000)
    libc.so.6 => /tmp/../lib64/tls/libc.so.6 (0x0000003f0b000000)    <--
    /opt/compiler/gcc-4.8.2/lib64/ld-linux-x86-64.so.2 (0x00007f12f537a000)

为什么要加载不同的libc.so?


这是更多信息,感谢@qubert

$ readelf -a ./a.out | fgrep ORIGIN
0x000000000000000f (RPATH)              Library rpath: [$ORIGIN:$ORIGIN/lib:$ORIGIN/lib64:$ORIGIN/../lib:$ORIGIN/../lib64:/opt/compiler/gcc-4.8.2/lib:/opt/compiler/gcc-4.8.2/lib64]

$ gcc -v -g 1.c 2>&1 | fgrep collect
/home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../libexec/gcc/x86_64-xxx-linux-gnu/4.8.2/collect2 -rpath $ORIGIN:$ORIGIN/lib:$ORIGIN/lib64:$ORIGIN/../lib:$ORIGIN/../lib64:/opt/compiler/gcc-4.8.2/lib:/opt/compiler/gcc-4.8.2/lib64 --sysroot=/home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../x86_64-xxx-linux-gnu/sys-root --eh-frame-hdr -m elf_x86_64 -dynamic-linker /opt/compiler/gcc-4.8.2/lib64/ld-linux-x86-64.so.2 /home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../lib/gcc/x86_64-xxx-linux-gnu/4.8.2/../../../../lib64/crt1.o /home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../lib/gcc/x86_64-xxx-linux-gnu/4.8.2/../../../../lib64/crti.o /home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../lib/gcc/x86_64-xxx-linux-gnu/4.8.2/crtbegin.o -L/home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../lib/gcc/x86_64-xxx-linux-gnu/4.8.2 -L/home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../lib/gcc -L/home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../lib/gcc/x86_64-xxx-linux-gnu/4.8.2/../../../../lib64 -L/home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../x86_64-xxx-linux-gnu/sys-root/lib/../lib64 -L/home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../x86_64-xxx-linux-gnu/sys-root/usr/lib/../lib64 -L/home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../lib/gcc/x86_64-xxx-linux-gnu/4.8.2/../../../../x86_64-xxx-linux-gnu/lib -L/home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../lib/gcc/x86_64-xxx-linux-gnu/4.8.2/../../.. -L/home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../x86_64-xxx-linux-gnu/sys-root/lib -L/home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../x86_64-xxx-linux-gnu/sys-root/usr/lib /tmp/ccbKeW7k.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../lib/gcc/x86_64-xxx-linux-gnu/4.8.2/crtend.o /home/opt/gcc-4.8.2.xxx-r4/gcc-4.8.2.xxx-r4/sbin/../lib/gcc/x86_64-xxx-linux-gnu/4.8.2/../../../../lib64/crtn.o
古伯特

你的编译器,用于设置DT_RPATH$ORIGIN默认情况下使用其内置的规格。

的目的$ORIGIN是创建可执行文件,这些可执行文件可以与它们所依赖的共享库一起移动到其他地方:如果二进制文件被移动到运行路径中/alt/opt/bin并包含$ORIGIN/../lib在其运行路径中,则动态链接程序将首先在中查找其库/alt/opt/libld.so(8)联机帮助页中的更多详细信息

您的编译器的问题在于,它使用的是已弃用的DT_RPATH(而不是DT_RUNPATH),始终会首先搜索它,并且无法通过进行覆盖LD_LIBRARY_PATH为了避免这种情况,请尝试使用以下-Wl,--enable-new-dtags方法gcc

gcc -Wl,--enable-new-dtags file.c

这将指示链接器使用DT_RUNPATH而不是使用DT_RPATH-rpath选项,无论是在命令行上还是通过规范进行设置。较早的系统应该不支持此功能,但是据我所记得,那是很久以前的事了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

GNU libc.so如何既是共享对象又是独立可执行文件?

来自分类Dev

覆盖正在运行的可执行文件或.so

来自分类Dev

ld.so是可执行文件吗?

来自分类Dev

与较新的libstdc ++。so链接时,为什么C ++可执行文件的运行速度如此之快?

来自分类Dev

使用rsync覆盖正在使用的.so文件或可执行文件是否安全?

来自分类Dev

为什么SecureString解密在可执行文件之间给出不同的结果?

来自分类Dev

Ruby SQLite3 OCRA可执行文件缺少sqlite_native.so

来自分类Dev

没有扩展名的Linux可执行文件的共享库(.so)之间的区别?

来自分类Dev

ldd可执行文件如何找到/usr/lib64/libstdc++.so.6?

来自分类Dev

来自不同 cd 的不同可执行文件总是运行相同的代码

来自分类Dev

如何将 32 位共享库(.so 文件)链接到 32 位可执行文件?

来自分类Dev

链接可执行文件与共享库时,为什么GNU ld解析符号的方式不同?

来自分类Dev

当xterm指向同一可执行文件时,为什么xterm的行为与x-terminal-emulator不同?

来自分类Dev

如何在不同目录中填充具有相同名称的可执行文件?

来自分类Dev

可以从相同的源代码生成功能上不同的可执行文件吗?

来自分类Dev

具有不同图标的相同可执行文件

来自分类Dev

构建可执行文件时涉及.so库时对错误的未定义引用

来自分类Dev

覆盖默认的/lib64/ld-linux-x86-64.so.2以调用可执行文件

来自分类Dev

如何使可执行文件运行不同的进程?

来自分类Dev

从不同的jar构建可执行文件

来自分类Dev

为什么ELF可执行文件具有固定的加载地址?

来自分类Dev

为什么ELF可执行文件具有固定的加载地址?

来自分类Dev

libopencv_features2d.so.2.4存在于/ usr / local / lib中,但是可执行文件需要libopencv_features2d.so.2.3

来自分类Dev

为什么运行“错误”的可执行文件?

来自分类Dev

为什么用GHC 7.10.2构建的可执行文件同时具有librt和libc的依赖关系?

来自分类Dev

无法加载可执行文件

来自分类Dev

与位置无关的可执行文件:什么是“主要可执行二进制文件”?

来自分类Dev

我使用os.system运行可执行文件,但它需要一个.so文件,找不到库

来自分类Dev

ld链接器的输出可执行文件大于golink输出的可执行文件,为什么?

Related 相关文章

  1. 1

    GNU libc.so如何既是共享对象又是独立可执行文件?

  2. 2

    覆盖正在运行的可执行文件或.so

  3. 3

    ld.so是可执行文件吗?

  4. 4

    与较新的libstdc ++。so链接时,为什么C ++可执行文件的运行速度如此之快?

  5. 5

    使用rsync覆盖正在使用的.so文件或可执行文件是否安全?

  6. 6

    为什么SecureString解密在可执行文件之间给出不同的结果?

  7. 7

    Ruby SQLite3 OCRA可执行文件缺少sqlite_native.so

  8. 8

    没有扩展名的Linux可执行文件的共享库(.so)之间的区别?

  9. 9

    ldd可执行文件如何找到/usr/lib64/libstdc++.so.6?

  10. 10

    来自不同 cd 的不同可执行文件总是运行相同的代码

  11. 11

    如何将 32 位共享库(.so 文件)链接到 32 位可执行文件?

  12. 12

    链接可执行文件与共享库时,为什么GNU ld解析符号的方式不同?

  13. 13

    当xterm指向同一可执行文件时,为什么xterm的行为与x-terminal-emulator不同?

  14. 14

    如何在不同目录中填充具有相同名称的可执行文件?

  15. 15

    可以从相同的源代码生成功能上不同的可执行文件吗?

  16. 16

    具有不同图标的相同可执行文件

  17. 17

    构建可执行文件时涉及.so库时对错误的未定义引用

  18. 18

    覆盖默认的/lib64/ld-linux-x86-64.so.2以调用可执行文件

  19. 19

    如何使可执行文件运行不同的进程?

  20. 20

    从不同的jar构建可执行文件

  21. 21

    为什么ELF可执行文件具有固定的加载地址?

  22. 22

    为什么ELF可执行文件具有固定的加载地址?

  23. 23

    libopencv_features2d.so.2.4存在于/ usr / local / lib中,但是可执行文件需要libopencv_features2d.so.2.3

  24. 24

    为什么运行“错误”的可执行文件?

  25. 25

    为什么用GHC 7.10.2构建的可执行文件同时具有librt和libc的依赖关系?

  26. 26

    无法加载可执行文件

  27. 27

    与位置无关的可执行文件:什么是“主要可执行二进制文件”?

  28. 28

    我使用os.system运行可执行文件,但它需要一个.so文件,找不到库

  29. 29

    ld链接器的输出可执行文件大于golink输出的可执行文件,为什么?

热门标签

归档