c-OS X上的弱符号别名类似于Linux上的别名,还是最接近的等效别名?

我所做的

在为Linux编写共享库时,我倾向于注意重定位,符号可见性,GOT / PLT等。

如果适用,我试图避免在同一库中的函数相互调用时调用PLT存根。 例如,假设一个共享对象提供了两个公共功能-_foo和2560602878452958958209(这两个功能都可以由用户调用)。 但是_foo()函数也调用_bar()。因此,在这种情况下,我要做的是:

  1. 定义_foofoo209具有私有可见性的功能。
  2. 分别为_foo()_bar()定义_foo和2560602878452958958弱别名。

这样,共享库中的代码就永远不会使用弱符号。 它仅直接调用本地函数。 例如,当调用_foo时,它将直接调用foo

但是用户不了解_foo的功能,并且始终使用相应的弱别名。

我该怎么做

在Linux中,这是通过使用以下构造实现的:

extern __typeof (_NAME) NAME __attribute__(weak, alias("_NAME"));

问题

不幸的是,这不适用于OSX。我对OS X或其二进制格式没有很深的了解,所以我仔细研究了一下,发现了一些弱函数的示例(例如此函数),但是这些函数并没有那么做。 与您可以使用弱符号相同,但不能使用弱符号作为DSO本地功能的别名。

可能的解决方案...

现在,我刚刚禁用了此功能(使用宏实现),以便所有符号都是全局的并具有默认可见性。 我现在可以想到的唯一方法是使所有_foo功能都具有私有可见性,并具有相应的foo具有默认可见性的功能,并将其称为“隐藏”对应物。

有更好的方法吗?

但是,这需要更改大量代码。 因此,我宁愿不要去那里,除非真的没有其他方法。

那么,封闭式OS X替代品是什么?获得相同语义/行为的最简单方法是什么?

Community asked 2019-10-08T19:07:10Z
1个解决方案
1 votes

在OS X上,在库中进行的调用是自动直接调用,并且不会通过dyld存根。 事实证明,如果您希望能够注入替代功能来为调用提供服务,则需要使用interposable强制间接访问符号并通过dyld存根强制执行调用。 否则,默认情况下,本地调用将是直接的,并且不会产生通过dyld运行的开销。

因此,您在Linux上的优化已经是默认行为,并且不需要别名。

但是,如果您只是想使平台兼容的代码更简单,就可以使用别名。 您只需使用“ weak_import”或“ weak”(如果要合并)作为属性名称。

extern typeof(_NAME)名称__attribute(weak_import,alias(“ _ NAME”)));

Apple关于弱链接的参考:弱链接的标记符号
Apple关于Mach-O运行时绑定的参考:符号定义的范围和处理

Rob_vH answered 2019-10-08T19:07:56Z
translate from https://stackoverflow.com:/questions/18260207/weak-symbol-aliases-on-os-x-similar-to-those-on-linux-or-a-closest-equivalent