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

问题描述:

从文档的描述,他们似乎做同样的事情,除了支持共享的说:“不是所有的系统”和“只有一些系统”支持符号(现在还不清楚,如果这些是同一套系统):-symbolic和-shared GCC标志有什么区别?

共享 生成一个共享对象,然后可以将其与其他对象链接到 形式的可执行文件。并非所有系统 都支持此选项。对于可预测的 结果,当您指定此 选项时,还必须指定 用于生成代码(-fpic,-fPIC或型号 子选项)的相同选项集合。

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

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

总结:-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()相同的共享对象中定义并绑定调用,使得它不能插入。这样,您就知道从共享对象中的一个函数到同一个共享对象中的另一个函数的任何调用都不会被插入。

+0

不要像valgrind(也许gprof?)的工具通过插入工作?如果我做了一个符号构建,他们不会工作吗? – 2009-10-20 15:21:31

+0

Valgrind仍然应该作为-symbolic来防止共享内部对象,并且不会影响共享内部对象的插入。也就是说,真正重要的是象征性绑定的符号是Valgrind想要插入的符号。 – 2009-10-20 16:46:18

+1

如果有人再次发生这种情况:这样做的一个重要结果是,外部变量不再可以跨共享库边界工作。 – 2009-10-31 18:53:26