转自:Chapter 9. Dynamic Linking

参考:Linux动态链接器

Linux加载启动可执行程序的过程(一)内核空间加载ELF的过程

Linux加载启动可执行程序的过程(二)解释器完成动态链接

本文和 理解ld-linux.so.2 内容上有点重复

动态链接器——Dynamic Linker

动态链接器既可以直接运行,也可以间接运行

间接运行

动态链接器可以通过一些动态链接的程序(dynamically linked program) 或 共享对象(shared object) 间接运行。对于动态链接器间接运行这种情况,动态链接器的命令行选项没办法传给动态链接的程序 或 共享对象。像ELF这种情况,动态链接器的命令行选项放到了被执行程序的 .interp节中。

直接运行

动态链接器也可以采用如下方式直接运行:

/lib/ld-linux.so.*  [OPTIONS] [PROGRAM [ARGUMENTS]]

不同二进制格式处理方式

程序ld.so和ld-linux.so *查找并加载程序需要的共享对象(共享库),为程序运行做准备,然后运行程序。Linux二进制文件需要在运行时动态链接链接,除非在编译期间给予ld命令-static选项。

a.out格式

程序ld.so处理a.out格式的二进制文件。a.out格式是很久以前使用的二进制格式。

ELF格式

ld-linux.so*处理ELF格式的二进制文件,ELF格式在Linux下已流行使用多年。(/lib/ld-linux.so.1用于libl5,/lib/ld-linux.so.2用于glibc2)
ld.so和ld-linux.so*处理二进制文件格式不同,如果相同,两者就具有相同的行为,并支持相同文件和程序,如ldd,ldconfig和/etc/ld.so.conf。

:libc是C库。基本上,它包含大多数程序在Linux上运行所需要的系统功能。 同时,它也包含很多C运行时库中的东西。libc6和glibc是相同的版本libc。官方的说法,它是GNU C库的第2版(但它是Linux C库的第六个主要版本)。目前用于Linux的libc有如下版本libc4,libc5,libc6。更多介绍参考:What's the difference between glibc and libc6?

共享对象依赖关系解析

在解析共享对象依赖关系时,动态链接器首先检查依赖关系字符串,看它是否包含斜杠。

如果找到斜线,那么 依赖项字符串被解释为(相对或绝对)路径名,然后用哪个路径名加载共享对象。

如果找不到斜杠,则按如下顺序搜索:

1.编译目标代码时指定的动态库搜索路径;

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4.默认的动态库搜索路径/lib 或 /lib64;

5.默认的动态库搜索路径/usr/lib 或 /usr/lib64。

Linux动态连接器的更多相关文章

  1. linux动态库加载RPATH, RUNPATH

    摘自http://gotowqj.iteye.com/blog/1926771 linux动态库加载RPATH, RUNPATH 链接动态库 如何程序在连接时使用了共享库,就必须在运行的时候能够找到共 ...

  2. .netcore在linux下使用P/invoke方式调用linux动态库

    http://www.mamicode.com/info-detail-2358309.html   .netcore下已经实现了通过p/invoke方式调用linux的动态链接库(*.so)文件 1 ...

  3. linux动态库默认搜索路径设置的三种方法

    众所周知, Linux 动态库的默认搜索路径是 /lib 和 /usr/lib .动态库被创建后,一般都复制到这两个目录中.当程序执行时需要某动态库, 并且该动态库还未加载到内存中,则系统会自动到这两 ...

  4. 再探Linux动态链接 -- 关于动态库的基础知识

      在近一段时间里,由于多次参与相关专业软件Linux运行环境建设,深感有必要将这些知识理一理,供往后参考. 编译时和运行时 纵观程序编译整个过程,细分可分为编译(Compiling,指的是语言到平台 ...

  5. 技巧:Linux 动态库与静态库制作及使用详解

    技巧:Linux 动态库与静态库制作及使用详解 标准库的三种连接方式及静态库制作与使用方法 Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 L ...

  6. Linux 动态库剖析

    进程与 API 动态链接的共享库是 GNU/Linux® 的一个重要方面.该种库允许可执行文件在运行时动态访问外部函数,从而(通过在需要时才会引入函数的方式)减少它们对内存的总体占用.本文研究了创建和 ...

  7. linux动态库编译和使用

    linux动态库编译和使用详细剖析 引言 重点讲述linux上使用gcc编译动态库的一些操作.并且对其深入的案例分析.最后介绍一下动态库插件技术, 让代码向后兼容.关于linux上使用gcc基础编译, ...

  8. Android NDK开发及调用标准linux动态库.so文件

    源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...

  9. Linux动态频率调节系统CPUFreq之三:governor

    在上一篇文章中,介绍了cpufreq的core层,core提供了cpufreq系统的初始化,公共数据结构的建立以及对cpufreq中其它子部件提供注册功能.core的最核心功能是对policy的管理, ...

随机推荐

  1. online学习和offline学习

    参考:https://blog.csdn.net/a133521741/article/details/79221015 解释: (1)offline学习:每次训练完一个batch后再更新参数: (2 ...

  2. (十四)访问标志 Access_flags

    一.概念 上一章节讲到了常量池,如下图,常量池之后便是访问标志acess_flags,占2个字节(u2). 二.例子 编写一个接口. public interface Test{ public fin ...

  3. VSIX 插件

    https://blog.csdn.net/lynchee/article/details/83065608

  4. RabbitMQ官方教程五 Topic(GOLANG语言实现)

    在上一教程中,我们改进了日志记录系统. 我们没有使用只能进行虚拟广播的fanout交换器,而是使用直接交换器,并有可能选择性地接收日志. 尽管使用直接交换改进了我们的系统,但它仍然存在局限性-它不能基 ...

  5. bert论文笔记

    摘要 BERT是“Bidirectional Encoder Representations from Transformers"的简称,代表来自Transformer的双向编码表示.不同于 ...

  6. centos umount 卸载出错

    target is busy. (In some cases useful info about processes that use the device ) or fuser()) 解决 fuse ...

  7. thinkphp5 笔记 模型调用

    模型 useapp\index\model\Article as ArticleModel; //静态调用更新 $Article= ArticleModel::); $Article->name ...

  8. servlet中ServletContainerInitializer的简单说明

    根据官方文档到的说明 public interface ServletContainerInitializer Interface which allows a library/runtime to ...

  9. eNSP配置基本与高级访问控制列表

    首先我们进行基本的acl控制 拓扑图如下所示 首先我们对路由器进行基本ip配置 并在路由器上设置ospf协议 添加相邻的网段 在路由器上运行了ospf协议后 使用display ip route-ta ...

  10. python selenium学习

    selenium是一个python模块,具有自动化模拟浏览器的功能 selenium的中文文档地址:http://selenium-python-zh.readthedocs.io/en/latest ...