Compilation 如何将共享对象文件与其他共享或常规对象链接以生成新的对象文件?

Compilation 如何将共享对象文件与其他共享或常规对象链接以生成新的对象文件?,compilation,linker,shared-libraries,Compilation,Linker,Shared Libraries,我在这里阅读ELF规范: 第15页: 共享对象文件保存适合在两个上下文中链接的代码和数据。首先,联系 编辑器可以将其与其他可重定位和共享的对象文件一起处理,以创建另一个对象文件。 其次,动态链接器将其与可执行文件和其他共享对象组合,以 创建一个进程映像 我已经看到其他人提出了许多关于静态链接共享对象的问题,这似乎是本段所建议的,但通常的答案似乎是这样做是不可能的 要么我误解了这句话(可能),要么对如何使用共享对象没有达成共识 这段话是什么意思 要么我误解了这句话(可能) 这段话的意思是:有两种情

我在这里阅读ELF规范:

第15页:

共享对象文件保存适合在两个上下文中链接的代码和数据。首先,联系 编辑器可以将其与其他可重定位和共享的对象文件一起处理,以创建另一个对象文件。 其次,动态链接器将其与可执行文件和其他共享对象组合,以 创建一个进程映像

我已经看到其他人提出了许多关于静态链接共享对象的问题,这似乎是本段所建议的,但通常的答案似乎是这样做是不可能的

要么我误解了这句话(可能),要么对如何使用共享对象没有达成共识

这段话是什么意思

要么我误解了这句话(可能)

这段话的意思是:有两种情况下可以使用共享库:

  • 通过静态链接器(又称链接编辑器),从可重新定位的对象中构建新的共享库或可执行文件(即从
    ET\u REL
    s构建新的
    ET\u DYN
    ET\u EXEC
    ),以及
  • 通过动态链接器来构建进程映像
  • 请注意,案例1中构建的新共享库不包括现有的共享库。只有在静态链接器知道新共享库(或可执行文件)如何引用现有库中的符号时,才需要现有库

    我看到的大多数问题(可能还有你提到的问题)都是“如何将现有的
    libfoo.so
    放入一个新的
    libbar.so
    ?”,这实际上是不可能的

    更新:


    我还是不太明白。#1是共享库的初始创建吗

    是:创建新的共享库或可执行文件

    因为可执行文件也有两个上下文:1)静态链接器用可重定位对象创建可执行文件,2)使用加载程序构建进程映像

    这是正确的,但仅适用于动态链接的可执行文件。完全静态的可执行文件根本不涉及加载程序

    对于可重新定位的对象,我也可以说类似的事情

    不完全是:可重定位对象通常不参与进程映像构建(也有例外,但它们确实是特殊的和奇怪的),而且它们肯定不是由动态链接器(装入器)处理的


    就所有实际用途而言,可重定位对象只能用作共享库或可执行文件的构建块。

    我仍然不确定我是否理解。#1是共享库的初始创建吗?因为可执行文件也有两个上下文:1)静态链接器用可重定位对象创建可执行文件,2)使用加载程序构建进程映像。对于可重新定位的对象,我也可以说类似的话。@DavidDavidson我已经更新了答案,但我不确定我是否理解了你想问的问题。