转自: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. Flink FileSink 自定义输出路径——BucketingSink

    今天看到有小伙伴在问,就想着自己实现一下. 问题: Flink FileSink根据输入数据指定输出位置,比如讲对应日期的数据输出到对应目录 输入数据: 20190716 输出到路径 20190716 ...

  2. LeetCode_206. Reverse Linked List

    206. Reverse Linked List Easy Reverse a singly linked list. Example: Input: 1->2->3->4-> ...

  3. 【超分辨率】—图像超分辨率(Super-Resolution)技术研究

    一.相关概念 1.分辨率 图像分辨率指图像中存储的信息量,是每英寸图像内有多少个像素点,分辨率的单位为PPI(Pixels Per Inch),通常叫做像素每英寸.一般情况下,图像分辨率越高,图像中包 ...

  4. 正确删除k8s版本jenkins的pod

    1.kubectl delete -f jenkins-deployment.yaml 或者先删除pod,再删除对应的depllyment 这两步都要执行否则删除pod不管用 2.删除数据目录下的数据 ...

  5. docker进入容器内部执行命令

    [root@bogon ~]# docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 38a2cae4c32f jenk ...

  6. CF1197D Yet Another Subarray Problem

    思路: 使用动态规划,在经典的最大子段和解法基础上进行扩展.dp[i][j]表示以第i个数为结尾,并且长度模m等于j的所有子段的最大cost. 实现: #include <bits/stdc++ ...

  7. [OpenCV开发]OpenCV图像编码和解码 imencode和imdecode使用,用于网络传输图片

    在很多应用中,经常会直接把图片的二进制数据进行交换,比如说利用 socket 通信传送图片二进制数据,或者直接用内存数据库(例如 Redis)来传递图片二进制数据. 这个时候,当你的应用程序读到内存里 ...

  8. idea安装阿里云插件和sonar插件

    重启idea

  9. DataGridView中的Combobox的应用

    在WinForm中DataGridView可谓是应用比较多的数据显示控件了,DataGridView中可以应用各种控件,关于这样的文章网上 已有很多.都是实例化一个控件然后通过DataGridView ...

  10. [转帖]Nginx Image Module图片缩略图 水印处理模块

    Nginx Image Module图片缩略图 水印处理模块 https://www.cnblogs.com/jicki/p/5546972.html Nginx Image Module图片缩略图 ...