从文档的描述,他们似乎做同样的事情,只是“不是所有的系统”支持共享和“只有一些系统”支持符号(现在还不清楚,如果这些是同一套系统):

  

-shared       产生,然后可以与其它对象链接到一个共享对象   形成一个可执行文件。并非所有的系统   支持此选项。对于可预见的   结果,你还必须指定   相同的一组选项,用来   生成代码(-fpic,-fPIC,或者模型   子选项)当您指定此   选项1]

     

-symbolic       全球绑定符号引用构建共享对象时。警告   任何未解决的引用   (除非覆盖链接编辑器   选项-Xlinker -z -Xlinker DEFS)。   只有少数系统支持此   选项。

我怀疑不同的是在“生产,然后可以与其它对象连接以形成可执行的共享对象”的一部分,但是这听起来像的东西,是任何库的真。是否表示生成的共享对象可以被静态地链接的太

有帮助吗?

解决方案

要点:-symbolic防止帧内的共享对象函数插入

使用共享对象链接允许一种称为符号插入功能。我们的想法是,你可以“介”全局符号的一个新的定义,以便它被称为而不是“正规军”的定义。

一个典型的例子是malloc()函数。在最常见的情况下,的malloc()被libc的内定义。但是你可以通过加载库干预自己的版本的malloc,它定义符号加载之前的libc(最运行时链接让你之前的可执行文件使用LD_PRELOAD特定库加载)。

默认情况下,共享对象不是静态中的任何功能是一个全球性的符号。正因为如此,在共享对象中的任何功能都可以插入上。考虑这样一个共享对象具有功能高级别的()和low_level()和高级别的()调用low_level(),因为它的实现的一部分,没有高级别的(),也不low_level()是静态的功能的情况。

这是可能的介low_level(),使得高级别的()被调用low_level()从一个不同的共享对象。

这是其中-symbolic进来。在创建共享对象,链接器将看到low_level()在相同的共享对象被定义为高级别的()和绑定的呼叫,使得它不能被插入。这样,你知道,从一个函数在你的共享对象到另一个在相同的共享对象的任何调用将永远不会上插入。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top