【问题标题】:Obiective-C, find global variable at Runtime?Obietive-C,在运行时找到全局变量?
【发布时间】:2012-10-02 11:27:31
【问题描述】:

我很想知道是否有任何方法可以在运行时找到全局变量,就像 NSClassFromString 一样。变量 BOOL 是在静态库中定义的,我通过使用“nm”找到了名称,该名称给出了以下输出:“0001924d b _gStartSessionCalled”。在 XCode 中调试时,我可以添加一个表达式“gStartSessionCalled”,并在应用运行时查看值的变化。

我想做的是找到 gStartSessionCalled 的值并更改该值。我知道这样做有点奇怪,但请忽略原因。

【问题讨论】:

  • 您想在调试器中还是在代码中执行此操作?

标签: objective-c


【解决方案1】:

nm 输出中的小写字母“b”

0001924d b _gStartSessionCalled

表示gStartSessionCalled 是本地(非外部)符号。例如,它可以定义为

static BOOL gStartSessionCalled;

在您的图书馆中。据我所知,您无法从定义它们的目标文件外部访问本地符号。

调试器可以使用符号表查找地址并显示变量,但链接器拒绝链接来自不同目标文件的本地符号。

【讨论】:

  • 猜猜那是不可能的。太糟糕了。谢谢!
【解决方案2】:

全局变量不是 Objective-C 特定的构造。它是纯 C 语言,您可以在知道它的名称时通过声明它来访问每个全局变量

extern <type> <name>;

例如在你的情况下

extern BOOL gStartSessionCalled;
…
gStartSessionCalled = YES;

更新:

如果您在编译时不知道变量的名称,您仍然可以在运行时使用dlsym 之类的东西找到符号地址。我不知道在 MacOS 上和在 Linux 上是不是一样的,但是会有类似的。

【讨论】:

  • 我需要把它放在哪里?我已经尝试过了,我得到一个链接器错误:体系结构 i386 的未定义符号:“_gStartSessionCalled”,引用自:-[AppDelegate application:didFinishLaunchingWithOptions:] in AppDelegate.o
  • 哪个库包含符号?你可以链接这个库或者告诉你的编译器忽略未定义的符号。
  • 它叫做 libFlurryAnalytics。
  • Martin R 在his answer 中声明该符号是本地的。然后你不能通过声明extern来访问它(正如马丁也说过的那样)。如果你对 hack 感兴趣,你仍然可以在运行时找到它并使用它的地址来修改它。
猜你喜欢
  • 2017-02-23
  • 1970-01-01
  • 2020-01-15
  • 2022-10-14
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多