我所做的
在为Linux编写共享库时,我倾向于注意重定位,符号可见性,GOT / PLT等。
如果适用,我试图避免在同一库中的函数相互调用时调用PLT存根。 例如,假设一个共享对象提供了两个公共功能-_foo和2560602878452958958209(这两个功能都可以由用户调用)。 但是_foo()函数也调用_bar()。因此,在这种情况下,我要做的是:
定义_foo和foo209具有私有可见性的功能。
分别为_foo()和_bar()定义_foo和2560602878452958958弱别名。
这样,共享库中的代码就永远不会使用弱符号。 它仅直接调用本地函数。 例如,当调用_foo时,它将直接调用foo。
但是用户不了解_foo的功能,并且始终使用相应的弱别名。
我该怎么做
在Linux中,这是通过使用以下构造实现的:
extern __typeof (_NAME) NAME __attribute__(weak, alias("_NAME"));
问题
不幸的是,这不适用于OSX。我对OS X或其二进制格式没有很深的了解,所以我仔细研究了一下,发现了一些弱函数的示例(例如此函数),但是这些函数并没有那么做。 与您可以使用弱符号相同,但不能使用弱符号作为DSO本地功能的别名。
可能的解决方案...
现在,我刚刚禁用了此功能(使用宏实现),以便所有符号都是全局的并具有默认可见性。 我现在可以想到的唯一方法是使所有_foo功能都具有私有可见性,并具有相应的foo具有默认可见性的功能,并将其称为“隐藏”对应物。
有更好的方法吗?
但是,这需要更改大量代码。 因此,我宁愿不要去那里,除非真的没有其他方法。
那么,封闭式OS X替代品是什么?获得相同语义/行为的最简单方法是什么?