C OSX上的弱符号别名与Linux上的类似,还是最接近的等效名称?
我所做的 在为Linux编写共享库时,我倾向于关注重定位、符号可见性、GOT/PLT等 如果适用,我会尽量避免在同一库中的函数相互调用时调用PLT存根。例如,假设一个共享对象提供了两个公共函数-C OSX上的弱符号别名与Linux上的类似,还是最接近的等效名称?,c,linux,macos,linker,dynamic-linking,C,Linux,Macos,Linker,Dynamic Linking,我所做的 在为Linux编写共享库时,我倾向于关注重定位、符号可见性、GOT/PLT等 如果适用,我会尽量避免在同一库中的函数相互调用时调用PLT存根。例如,假设一个共享对象提供了两个公共函数-foo()和bar()(这两个函数都可以由用户调用)。但是,bar()函数也调用foo()。因此,我在本例中所做的是: 定义具有私有可见性的\u foo()和\u bar()函数 分别为\u foo()和\u bar()定义foo()和弱别名 这样,共享对象中的代码就不会使用弱符号。它只直接调用本地函数。
foo()
和bar()
(这两个函数都可以由用户调用)。但是,bar()
函数也调用foo()
。因此,我在本例中所做的是:
\u foo()
和\u bar()
函数\u foo()
和\u bar()
定义foo()
和弱别名
\u bar()
时,它直接调用\u foo()
但是用户不知道.*
函数,总是使用相应的弱别名
我是怎么做的
在Linux中,这是通过使用以下构造实现的:
extern __typeof (_NAME) NAME __attribute__(weak, alias("_NAME"));
问题
不幸的是,这对OS X不起作用。我对OS X或其二进制格式没有深入的了解,所以我仔细研究了一下,发现了一些弱函数的示例(如),但它们的作用并不完全相同,因为可以有一个弱符号,但不是一个作为DSO本地函数别名的弱符号
可能的解决方案…
现在,我刚刚禁用了此功能(使用宏实现),以便所有符号都是全局的,并具有默认可见性。目前,我唯一能想到的实现这一点的方法是让所有\u foo
函数具有私有可见性,并让相应的foo
函数具有默认可见性并调用其“隐藏”对应项
更好的方法?
然而,这需要更改大量代码。因此,除非真的没有其他办法,否则我宁愿不去那里
那么,要获得相同的语义/行为,OSX的替代方案或最简单的方法是什么呢?在OSX上,在库中进行的调用是自动直接调用,不通过dyld存根。这一事实的证据是,如果希望能够注入替代函数来为调用提供服务,则需要使用interposable来强制间接访问符号,并通过dyld存根强制执行调用。否则,默认情况下,本地调用将是直接的,不会产生通过dyld运行的开销 因此,Linux上的优化已经是默认行为,不需要别名 尽管如此,如果您只是想让平台兼容代码更简单,仍然可以使用别名。您只需要使用“弱导入”或“弱”(如果希望合并)作为属性名 externtypeof(_NAME)NAME属性(弱导入,别名(_NAME)) 关于弱链接的Apple参考:
Mach-O运行时绑定上的Apple参考:您的目标是否只是在调用同一库中的符号时避免通过PLT存根调用的开销?你确认链接器没有为你处理这个问题吗?我的理解是,你所追求的是OS X上共享库的默认行为。我发现的唯一一个接近于明确这一点的文档是关于
-interposable\u列表的ld
手册页部分论点它指出,对模块内符号的调用将是直接调用,除非该符号被标记为可插入,在这种情况下,它将通过dyld存根进行。您应该读到:对我来说,这听起来像是过早的优化。@NigelNquande不,该站点不用于代码级编程,除非它是Automator,Applescript,等等。主要是Mac使用帮助。资料来源:他们两分钟的巡演就是这么说的。