【问题标题】:Making a local symbol global使局部符号全局化
【发布时间】:2011-06-29 20:43:08
【问题描述】:

有没有办法增加共享对象中函数的符号范围?

我正在移植一个使用 glDrawTexiOES 的 OpenGL ES 1.x 示例,该示例在为我正在使用的板提供的 OpenGL ES 库中定义,但被定义为本地符号,因此当我编译 &链接示例,它给了我一个未定义的参考。

【问题讨论】:

    标签: c++ opengl-es linker g++


    【解决方案1】:

    不幸的是,自动变量在内存中布局的本质是不可能的。 (它们不驻留在稳定的、永久的内存位置。)您唯一能做的就是分配一个全局变量,然后在某个合适的时间点将局部变量复制到全局变量中。但在这种情况下,您可能只使用全局变量。

    不存在变量“成为全局”的特定时间点。全局变量必须在加载时为程序所知,并且在程序的整个生命周期中都存在。

    【讨论】:

    • 问题是关于从共享库导出的符号的全局/本地状态:而不是进程中自动变量和全局变量之间的区别。
    • @Kerrek SB,正如@acm 所说,我指的是从共享库导出的符号,在我的情况下,符号指的是一个函数。我想知道我是否有一种“官方”的方式来破解这个状态。
    • 哦,我明白了。对困惑感到抱歉。我不知道,也许你可以摆弄导出表?但我不知道怎么做。
    【解决方案2】:

    我认为如果不通过一些自定义程序或非常低级的 ELF 实用程序将库编辑为二进制文件,就不可能将本地符号的配置更改为全局。但我不建议将这种方法用于您要在生产中运行或打算维护的任何东西。

    不过,我对 GL 也不太了解:

    • glDrawTexiOES 是本地的,因为它被视为库的实现细节。在这种情况下,作为本地符号,您不得使用它,因为库作者已明确拒绝您访问,因此可以随时更改其认为合适的签名和解释。

    • glDrawTexiOES 应该是全局的,因为它是 GL API 的一部分,并且您的板的 GL 库的作者未能通知链接器应该导出符号。如果是这种情况,您应该向上游报告错误。

    【讨论】:

      猜你喜欢
      • 2020-08-08
      • 2019-03-31
      • 2011-02-05
      • 2011-11-18
      • 2021-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多