首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于静态链接器、动态链接器、加载程序和动态加载程序的可执行ELF文件分别是什么?

问用于静态链接器、动态链接器、加载程序和动态加载程序的可执行ELF文件分别是什么?
EN

Unix & Linux用户
提问于 2018-10-20 18:37:42
回答 1查看 1.6K关注 0票数 2

在Linux中,可执行的ELF文件分别用于

  • 静态链接器
  • 动态链接器
  • 装载机
  • 动力装载机?

它们中的哪一个被调用

  • 由execve()
  • 由dlopen()?

如何由execve()或dlopen()调用它们,以解决execve()或dlopen()用于调用可执行文件的鸡蛋问题?

谢谢。

EN

回答 1

Unix & Linux用户

发布于 2018-10-20 18:58:09

我猜你用的是杰夫·达西的定义:

  • 静态链接涉及在编译时解析符号,而动态链接涉及在运行时解析符号;
  • 静态加载涉及在加载时映射可执行文件和库,而动态加载涉及在进程启动后映射库。

尝试把所有的东西分开都是没有意义的;相反,您应该考虑这对特性:

  • 静态加载,静态链接:链接器通常是/usr/bin/ld,以及静态库(.a);加载程序是内核;
  • 静态加载,动态链接:链接器再次是/usr/bin/ld,但带有共享库(.so);加载程序是二进制解释器,例如64位x86上Debian 9上的/lib64/ld-linux-x86-64.so.2 (当前映射到/lib/x86_64-linux-gnu/ld-2.24.so ),内核本身加载,也加载主可执行文件;
  • 动态加载,静态链接:据我所知,这在Linux上没有使用;
  • 动态加载,动态链接:加载器是一个库,如libdl;链接器在库和调用libdl的程序之间分离。

也许还需要就最后一点作出更多解释。当程序使用libdl加载库时,它调用dlopen (它加载命名库)以及进程中无法使用的任何依赖项,并将命名库与其依赖项链接起来。因此,libdl执行加载(必需的库)和链接(仅对库,而不是调用程序)。当调用程序需要使用命名库中的符号时,它调用dlsym,它返回所请求符号的地址(如果能够找到的话)。因此,调用程序执行部分链接。

在execve或dlopen方面没有鸡与蛋问题.为使用execve而编译的程序具有对libc (其中包含大多数程序实际使用的包装器)和execve符号(严格地说,上述包装器)的适当引用。这些引用可以在编译时(用于静态链接的程序)或在加载时(对于动态链接的程序)进行解析;之后,符号可以使用,程序可以调用execve。dlopen也是如此:希望使用dlopen的程序是用对libdl和dlopen的适当引用来编译的。动态链接器本身是一个静态二进制文件,因此内核可以在不需要动态链接器帮助的情况下加载它。您将在程序如何运行和程序如何运行:精灵二进制文件中找到关于这个主题的更多细节。

(请注意,在所有动态链接的情况下,如果启用了延迟绑定,则链接可以准时进行,而不一定在加载时进行。)

票数 7
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/476780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档