什么是-symbolic和-shared GCC标志之间的区别?(What's the di

2019-08-20 10:56发布

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

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

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

我猜想不同的是,在“生产,然后可以与其他对象成一个可执行的链接共享对象”的一部分,但听起来似乎是任何图书馆的真实。 这是否意味着产生的共享对象可以静态链接太多?

Answer 1:

总结:-symbolic防止帧内共享对象函数插入

与共享对象链接允许所谓的符号插入功能。 这个想法是,你可以“干预”一个全球性的符号,这样它被称为而不是“正规军”定义的新定义。

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

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

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

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



文章来源: What's the difference between the -symbolic and -shared GCC flags?