从文档的描述来看,它们似乎做了同样的事情,除了“并非所有系统”支持共享并且“只有某些系统”支持符号(尚不清楚这些是否是同一组系统):
-共享
生成一个共享对象,然后可以将其与其他对象链接起来
形成可执行文件。并非所有系统
支持这个选项。对于可预测的
结果,您还必须指定
与过去使用的相同选项集
生成代码(-fpic、-fPIC 或模型
子选项)当您指定此选项时
选项1]
-象征性的
构建共享对象时将引用绑定到全局符号。警告
关于任何未解决的参考文献
(除非被链接编辑器覆盖
选项 -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() 在同一共享对象中定义,并绑定该调用,使其无法被插入。这样,您就知道从共享对象中的一个函数到同一共享对象中的另一个函数的任何调用都不会被插入。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)