转自: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. jquery 单击选中 再次选中取消选中

    html: <div id="full" class='weui-popup__container' style="background: #fff"&g ...

  2. Nodejs Client for FastDFS

    FastDFS 是分布式文件存储系统.这个项目是FastDFS的NodeJS客户端,用来与FastDFS Server进行交互,进行文件的相关操作.我测试过的server版本是4.0.6. githu ...

  3. Sequelize 类 建立数据库连接 模型定义

    1:Sequelize 类 Sequelize是引用Sequelize模块获取的一个顶级对象,通过这个类可以获取模块内对其他对象的引用.比如utils.Transaction事务类.通过这个顶级对象创 ...

  4. 12点睛Spring4.1-Spring Aware

    12.1 Aware 我们设计的准则是解耦,这就意味着我们不能对Spring的IoC容器有直接的依赖,但是我们还是想我们的bean能识别容器的资源; 使用aware能让我们在应用的任意位置获得spri ...

  5. API SendMessage 带参数

    代码未测试 [DllImport("USER32", EntryPoint = "SendMessage", CharSet = CharSet.Auto, S ...

  6. Word中如何加载EndNote

    在百度中搜索了很多解决方案,都不尽相同忙了一上午也没解决,然后搁浅,吃过午饭回来在安装目录下找到如下exe文件三四步点击搞定 所以,有时候问题出现了长时间没解决,可以换下环境出去溜达一圈说不定就茅塞顿 ...

  7. Django orm练习

    ORM练习题 models生成 from django.db import models # Create your models here. # 书籍管理 class Book(models.Mod ...

  8. Java多线程系列--AQS之 LockSupport

    concurrent包是基于AQS (AbstractQueuedSynchronizer)框架的,AQS(JAVA CAS原理.unsafe.AQS)框架借助于两个类: Unsafe(提供CAS操作 ...

  9. java当中JDBC当中的transaction例子

    [学习笔记] 7.jdbc的transaction例子: import java.sql.*; public class MySQlTransaction1 { public static void ...

  10. Mac中设置Sublime快速在终端中使用命令打开项目

    工作中用Atom比较多,比较喜欢Atom可以直接在终端中直接输入atom .就能直接打开项目的功能,于是搜索得知sublime text也有这样的功能,下面就简单的配置了一下: sudo ln -s ...