Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C OSX上的弱符号别名与Linux上的类似,还是最接近的等效名称?_C_Linux_Macos_Linker_Dynamic Linking - Fatal编程技术网

C OSX上的弱符号别名与Linux上的类似,还是最接近的等效名称?

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()和弱别名 这样,共享对象中的代码就不会使用弱符号。它只直接调用本地函数。

我所做的

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

如果适用,我会尽量避免在同一库中的函数相互调用时调用PLT存根。例如,假设一个共享对象提供了两个公共函数-
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使用帮助。资料来源:他们两分钟的巡演就是这么说的。