c - -symbolic 和 -shared GCcflags之间有什么区别?

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

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

-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/

相关文章:

c - 堆大小错误字符串

c - 用于为索尼阅读器 prs900 编译/交叉编译 gcc 的 binutils

c++ - 使用指针和 union

c - C 语言基数排序与 OpenMP 的并行化

c - 为什么 clang 需要 -lm 不像 gcc?

c++ - 关于/kreplacements/kreplacements.h 的错误

c++ - 共享库依赖于其他具有硬编码路径的库

c++ - 对共享库函数的 undefined reference

c++ - C++ 中的全局数组会破坏二进制兼容性吗?

c - 为什么在下面的for循环中没有任何条件检查?