zoukankan      html  css  js  c++  java
  • Linux动态连接器

    转自: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。

             
         

  • 相关阅读:
    常用辅助类(ContDownLatch、CyclicBarrier、Semaphore)
    Redis
    SpringBoot
    微服务概述
    数据库 子查询和分页查询
    数据库基础语句,聚合函数,练习
    数据库基础知识

    for循环的类型以及while循环
    C#编程循环练习
  • 原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/9808047.html
Copyright © 2011-2022 走看看