使局部符号全局化

Making a local symbol global

本文关键字:全局 符号 使局      更新时间:2023-10-16

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

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

不幸的是,这是不可能的,因为自动变量是在内存中布局的。(它们不存在于稳定、永久的内存位置。)你唯一能做的就是分配一个全局变量,并在适当的时候将本地变量复制到全局中。但在这种情况下,您可能只需要在整个过程中使用全局变量。

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

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

然而,我对GL也不太了解:

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

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