什么是gcc共享库的.sa文件?

时间:2012-01-16 05:52:48

标签: linux gcc linker shared-libraries

我在http://www.linuxjournal.com/article/1052中看到一篇文章,其中指定了:

“共享库由两个基本部分组成:存根和图像。存根库的扩展名为.sa。存根是可执行文件将链接到的库。”

但另一个参考http://www.faqs.org/docs/Linux-HOWTO/GCC-HOWTO.html它说

“共享库文件( .sa用于a.out, .so用于ELF)” - 我理解为.sa是用于a的共享库.out格式,.so将使用最新的ELF格式。

由于这里不够清晰,我在这里问这个问题 - 什么是.sa文件?什么是存根?

2 个答案:

答案 0 :(得分:3)

他们可能都是正确的,但在他们自己的背景下。

第一篇文章的历史可以追溯到1995年,当时Linux采用了主流的ELF(它存在于94年中期,但你必须努力工作才能获得它)。事实上,它甚至讨论了ELF是一个相对较新的事实:

  

尽管ELF(为Unix SVR4设计的可执行文件和链接格式)使得创建共享库变得微不足道,但是现在的a.out DLL共享库可能需要支持一段时间。

所以它可能是正确的,因为它当时所知道或关心的是a.out格式。

HowTo的日期稍晚于1999年,讨论了a.outELF之间的差异,因此我认为它是一个更可靠的来源。那时候,ELF已成为主流多年。

当然,这是一个相对比较。更可靠的来源仍然有十多年的历史,谈论gcc 2.7,好像它是最新的和最好的,而事实上,我们将进展到4.6。

你可能想考虑找一些更新的东西。

答案 1 :(得分:3)

那篇文章非常陈旧(1995年),并且仍在处理前ELF(所谓的 a.out )共享库。

我忘记了细节,但在史前时代, a.out 共享库中没有位置独立,因此每个进程都有 - 例如 - 加载libc共享库使用今天过时的uselib(2)系统调用的相同位置 - (今天两个不同的进程mmap(2),作为共享的ELF对象,在不同的地址)。 .sa文件还需要此固定位置的约定。因此,制作共享库确实是一场噩梦:他们占用的固定地址段是按照传统方式为整个系统或分发定义的!

但你真的不应该在2012年关心,除非你对历史感兴趣(然后你必须挖掘一些可能很难找到的旧历史文件)。所有发行版,甚至是一些相当旧的版本(例如从2004年开始)都使用ELF格式,使每个进程能够按照自己的意愿mmap共享库。

今天,您可以使用/proc/1234/maps/proc/1234/smaps探索pid 1234进程的内存映射,您可以轻松了解ELF共享对象是否映射到不同的位置。另请阅读ASLR