-symbolic和-shared GCC标志之间有什么区别?

时间:2009-10-19 14:15:46

标签: c gcc shared-libraries dynamic-linking compiler-flags

从文档的描述中,他们似乎做了同样的事情,除了“并非所有系统”支持共享和“只有一些系统”支持符号(不清楚这些是否是同一组系统):

  

-shared       生成一个共享对象,然后可以将其与其他对象链接   形成可执行文件。不是所有的系统   支持此选项。可预测   结果,你还必须指定   以前用过的同一组选项   生成代码(-fpic,-fPIC或model   子指令)当你指定这个   选项1]

     

-symbolic       在构建共享对象时绑定对全局符号的引用。警告   关于任何未解决的参考文献   (除非被链接编辑器覆盖   选项-Xlinker -z -Xlinker defs)。   只有少数系统支持此功能   选项。

我怀疑不同之处在于“生成一个共享对象,然后可以与其他对象链接以形成可执行文件”部分,但这听起来像任何库都是如此。是否意味着生成的共享对象也可以静态链接?

1 个答案:

答案 0 :(得分:7)

摘要:-symbolic防止内部共享对象功能插入

链接共享对象允许称为符号插入的功能。我们的想法是,您可以“插入”全局符号的新定义,以便调用它而不是“常规”定义。

一个典型的例子是malloc()。在最常见的情况下,malloc()在libc中定义。但是,在加载libc之前,可以通过加载定义该符号的库来插入自己的malloc版本(大多数运行时链接器允许您在可执行文件之前使用LD_PRELOAD加载特定的库)。

默认情况下,共享对象中非静态的任何函数都是全局符号。因此,可以插入共享对象中的任何函数。考虑一个场景,其中共享对象具有函数high_level()和low_level()以及high_level()调用low_level()作为其实现的一部分,并且high_level()和low_level()都不是静态函数。

可以插入low_level(),以便high_level()从另一个共享对象调用low_level()。

这就是-symbolic的用武之地。在创建共享对象时,链接器将看到low_level()在与high_level()相同的共享对象中定义,并绑定调用,使其无法插入。这样,您就知道从共享对象中的一个函数到同一共享对象中的另一个函数的任何调用都不会插入。