Linux上x86_64架构的动态链接器 ld-linux-x86-64.so.2

这篇具有很好参考价值的文章主要介绍了Linux上x86_64架构的动态链接器 ld-linux-x86-64.so.2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

/lib64/ld-linux-x86-64.so.2

/lib64/ld-linux-x86-64.so.2 是Linux操作系统上x86_64架构的动态链接器(也称为动态链接编辑器)。它负责加载和链接在运行时(即程序启动时或之后)被引用的动态库。现在,我们来深入了解其作用和重要性:

  1. 动态链接器的作用:

    • 当运行一个可执行程序时,该程序可能依赖于多个动态库(例如,常见的libc.so.6,它包含标准C函数如printfmalloc等)。这些库在编译时不会被静态地包含在程序内,而是在运行时被加载。
    • 这就是/lib64/ld-linux-x86-64.so.2的作用:它确保这些库被正确地加载到内存,并确保程序中的函数调用正确地映射到库提供的函数。
  2. 优势:

    • 节省空间:由于多个程序可能共享同一动态库的单一实例,这可以节省磁盘和内存空间。
    • 易于更新:当库需要更新或修复时,只需要替换库文件本身,不需要重新链接依赖它的所有程序。
  3. 如何工作:

    • 当运行一个程序时,内核不直接开始执行程序的代码。而是先启动动态链接器,并将程序的路径和其他参数传递给它。
    • 动态链接器首先读取程序需要的库列表(这些信息在程序的.dynamic部分中)。接着,它查找这些库(通常在/lib/usr/lib或由LD_LIBRARY_PATH环境变量指定的其他目录中),并将其加载到内存。
    • 之后,动态链接器处理链接过程中所有未解决的符号(例如,程序中调用的函数),确保它们都链接到适当的库中的地址。
    • 最后,动态链接器将控制权交还给程序,从main()函数开始执行。
  4. 查找共享库:

    • ld-linux使用一系列的策略和配置文件来确定在哪里查找共享库。这通常包括查看/etc/ld.so.cache文件(这是预先计算的共享库位置列表),检查特定的默认目录(如/lib/usr/lib),以及参考环境变量LD_LIBRARY_PATH
  5. ldd工具:

    • 可以使用ldd命令来查看程序依赖的共享库及其位置。这实际上是调用ld-linux来查询依赖性。

总之,/lib64/ld-linux-x86-64.so.2是Linux上的动态链接器,用于加载和链接动态库,进而可以运行各种程序。

/etc/ld.so.cache

/etc/ld.so.cache 文件在 Linux 系统中起到一个重要的作用:它缓存动态链接器查找共享库时所需的路径信息。以下是关于这个文件的详细介绍:

  1. 目的:

    • 当程序或系统调用共享库(例如 .so 文件)时,动态链接器需要知道在哪里找到这些文件。虽然有一些标准的位置(如 /lib/usr/lib),但共享库可能位于各种位置。
    • /etc/ld.so.cache 包含一个编译后的列表,列出了最常用的共享库的位置,这使得动态链接器能够迅速找到这些库,而不是搜索整个文件系统或其他可能的位置。
  2. 如何生成:

    • 这个文件是由 ldconfig 命令生成的。当系统管理员安装新的共享库或更改库的位置时,通常需要运行 ldconfig 来更新 /etc/ld.so.cache
    • ldconfig 会扫描预先定义的库路径(这些路径在 /etc/ld.so.conf 和其相关的 *.conf 文件中指定)以及默认的库路径(如 /lib/usr/lib)。然后,它会将找到的库的路径和名称存储在 /etc/ld.so.cache 中。
  3. 查看内容:

    • /etc/ld.so.cache 是一个二进制文件,因此直接查看它的内容可能不会提供可读的输出。
    • 为了查看其内容,可以使用 ldconfig -p 命令。这会显示当前缓存中所有库的列表及其位置。
  4. 为什么是重要的:

    • 通过缓存常见库的位置,系统可以更快地启动和运行依赖于这些库的程序。如果没有这个缓存,每次程序启动时,动态链接器都可能需要在多个目录中搜索所需的库,这会增加启动时间和系统负载。
  5. 更新:

    • 当安装新的共享库或更改已有的库位置时,最好运行 ldconfig 来更新 /etc/ld.so.cache。大多数包管理器(如 aptyumdnf)在安装包含共享库的包时会自动做这件事。

总之,/etc/ld.so.cache 是一个为系统上的动态链接器提供共享库位置信息的缓存文件。它通过 ldconfig 工具管理,并有助于提高系统的响应速度和效率。

ldd指令打印程序或共享库的动态依赖

ldd 是一个 Unix 和 Linux 命令行实用程序,用于打印程序或共享库的动态依赖。其主要目的是确定一个可执行文件或共享库需要哪些共享库,以及这些共享库在文件系统上的位置。

以下是关于 ldd 的详细介绍:

  1. 基本用法:

    • 使用 ldd 很简单。只需要提供一个可执行文件或共享库的路径。例如,要查看 /bin/ls 的依赖关系,可以使用:
      ldd /bin/ls
      
  2. 输出解释:

    • ldd 的输出将列出所有依赖的共享库,以及这些库在文件系统上的路径。例如:
      libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1
      libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6
      /lib64/ld-linux-x86-64.so.2 (0x00007f4c0d1b5000)
      
      这里,=> 之前的是共享库的名称,=> 之后的是该共享库在文件系统上的具体位置。
  3. 特别注意:

    • 使用 ldd 有潜在的风险。因为 ldd 实际上会尝试加载程序所列出的共享库。如果在不受信任的文件上运行 ldd,它可能会触发恶意代码的执行。因此,不要在不受信任的二进制文件上使用 ldd
  4. 其他选项:

    • -u:显示未使用的直接依赖。这有助于确定二进制文件链接了哪些不必要的库。
    • -r:执行数据段和函数解析,有助于发现运行时链接错误。
    • -v:输出所有版本信息。
  5. 工作原理:

    • ldd 实际上并不是真正“执行”给定的程序。相反,它设置一些特殊的环境变量,使动态链接器(如 /lib/ld-linux.so.2/lib64/ld-linux-x86-64.so.2)输出所需的共享库信息,而不是启动程序。
  6. 与其他工具的关系:

    • 尽管 ldd 非常有用,但它并不是分析二进制文件的唯一工具。objdumpreadelf 也是非常有用的工具,可以提供关于二进制文件结构和依赖关系的详细信息。

总的来说,ldd 是一个非常有用的工具,用于快速确定程序或共享库的动态依赖关系。但正如上面所提到的,当使用它时,尤其是在不受信任的二进制上,需要小心。文章来源地址https://www.toymoban.com/news/detail-785192.html

到了这里,关于Linux上x86_64架构的动态链接器 ld-linux-x86-64.so.2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 确定Mac\Linux系统的架构类型是 x86-64(amd64),还是 arm64 架构

    我们在下载软件或镜像时会有很多版本,那需要根据我们的系统架构选择正确的软件或镜像版本。 要确定你的系统使用的是 x86-64(amd64) 还是 arm64 架构,可以使用以下方法之一: 使用 uname 命令: 打开终端,并运行以下命令: 在MAC中: 如果输出结果是 x86_64 ,则表示你的系

    2024年02月08日
    浏览(45)
  • 【未解决】No rule to make target ‘/usr/lib/x86_64-linux-gnu/libGL.so‘

    测试ros自带的PCL1.8是否能用,网上找个测试代码,编译阶段报错: cmake .. -- Could NOT find ensenso (missing: ENSENSO_LIBRARY ENSENSO_INCLUDE_DIR)  ** WARNING ** io features related to ensenso will be disabled -- Could NOT find DAVIDSDK (missing: DAVIDSDK_LIBRARY DAVIDSDK_INCLUDE_DIR)  ** WARNING ** io features related to davidSDK wi

    2024年02月12日
    浏览(43)
  • linux系统上nodejs 报错:node: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.27‘ not found

    原因:因为当前系统不支持GLIBC_2.27,而且node的版本过高,但是后来降低了版本还是报这个错误,后来发现低版本的软链接在/usr/bin,而高版本的软链接在/usr/local/bin,一直使用了高版本所在的软链接 解决方法:删除/usr/local/bin中node的软链接,然后再安装一个比较低版本的no

    2024年02月16日
    浏览(57)
  • ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found

    网上大多数解决办法是找到含有GLIBCXX_3.4.29的文件并把这一项复制过去,但有时因为电脑libstdc++6版本过低,甚至不包含这一项。这里选择直接更新相应的库,但不曾考虑和过去文件的兼容性问题 本人设备:ubuntu22.04 答案来源:https://stackoverflow.com/questions/65349875/where-can-i-find-

    2024年04月26日
    浏览(39)
  • 在linux上使用C++调用动态链接库.so文件(输入两个参数)

    在新服务器上已经实现了用Python调用.so文件,现在尝试C++接口, 使用c++编写和使用.so动态链接库_51CTO博客_c++动态链接库 参考这个人的调用函数Linux C++简单生成与调用so库_秦小乙的工作台的博客-CSDN博客 记录在C++里面调用linux的地址直接写绝对路径就可以,不用双斜杠:stri

    2024年02月08日
    浏览(52)
  • 解决/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found问题

    网上有分析说调用的高版本的gcc,生成的动态库没有替换老版本gcc的动态库导致。因此需要把高版本的so文件复制到低版本的so文件目录下。如下分析: https://www.jianshu.com/p/6424807b7e20 但我报的错有点跟他们不太一样,我实在python的虚拟环境中执行的。我查看了虚拟环境中的s

    2024年02月17日
    浏览(60)
  • ImportError: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found

    今天主要解决一个 Bug: libstdc++.so.6: version GLIBCXX_3.4.29\\\' not found 主要是和 libstc++ 版本问题相关,找了很多方法,其他很多方法都是直接修改 libstc++.so 的版本,但是直接修改这种可能被多个共享库依赖的库版本将会牵一发动全身引出很多问题,本着 越复杂风险越大的原则 ,现

    2024年02月01日
    浏览(45)
  • 【Error】ImportError: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29‘ not found

    参考文章:如何解决version `GLIBCXX_3.4.29‘ not found的问题 在 wsl ubuntu20.04 运行 yolov8 时,出现以下错误 根据提示是 /usr/lib/x86_64-linux-gnu 路径下的 libstdc++.so.6 缺少 GLIBCXX_3.4.29 首先输入以下指令查看,当前有哪些版本 可以看到,确实缺少了 GLIBCXX_3.4.29 查看系统下同类型文件,存在

    2024年02月16日
    浏览(47)
  • aarch64-linux-gcc安装编译及生成so动态库和调用

    官方二进制下载 Ubuntu packages 提供了软件包: gcc-arm-linux-gnueabihf (4:7.4.0-1ubuntu2.3 以及其他的) 。 建议直接从 linaro 的官网下载相应版本的 gcc-linaro 交叉编译工具,并直接选择带有二进制的文件,即在官网入口处选择 binaries 路径,该文件夹下面包含各种版本的已经编译好的 aarch

    2024年02月13日
    浏览(58)
  • Linux conan+cmake管理的项目如何进行多架构编译(x86_64及交叉编译arm64)

    Conan 和 CMake 是两个非常流行的跨平台开发工具,它们可以让开发者轻松管理依赖和构建项目,支持多种操作系统和架构。下面是一些关于 conan 和 cmake 的介绍: Conan Conan 是一个用于管理 C++ 依赖项的开源工具。它可以从公共或私有存储库中自动下载和安装依赖项。Conan 可以轻

    2024年02月09日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包