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

博客探讨了在Linux和OSX中编写共享库时遇到的问题,特别是关于弱符号和函数别名的使用。在Linux中,作者通过弱符号实现内部函数调用,但在OSX上遇到不支持的情况。文章讨论了可能的解决方案,包括使用宏来禁用特定功能或创建具有不同可见性的函数。作者寻求在不大幅修改代码的情况下,找到一个与Linux类似的行为在OSX上的替代方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我所做的

在为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替代品是什么?获得相同语义/行为的最简单方法是什么?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值