从文档的描述来看,除了“并非所有系统”都支持共享和“只有一些系统”支持符号(不清楚这些是否是同一组系统)之外,它们似乎做同样的事情:
-shared Produce a shared object which can then be linked with other objects to form an executable. Not all systems support this option. For predictable results, you must also specify the same set of options that were used to generate code (-fpic, -fPIC, or model suboptions) when you specify this option.[1]
-symbolic Bind references to global symbols when building a shared object. Warn about any unresolved references (unless overridden by the link editor option -Xlinker -z -Xlinker defs). Only a few systems support this option.
我怀疑区别在于“生成一个共享对象,然后可以将其与其他对象链接以形成可执行文件”部分,但这听起来像是任何库都是如此。这是否意味着生成的共享对象也可以静态链接?
最佳答案
总结:-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() 在同一个共享对象中定义,并绑定(bind)调用,使其无法被插入。这样,您就知道从共享对象中的一个函数到同一共享对象中的另一个函数的任何调用都不会被插入。
关于c - -symbolic 和 -shared GCcflags之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1588915/