3

我不能在 iOS 中按名称调用函数吗?我有一个名为getstring. 我这样称呼它:

void* handle = dlopen(NULL, RTLD_NOW);
if (handle)
{
fp func = dlsym(handle, "getstring");
if (!func)
    responseField.text = [NSString stringWithUTF8String:dlerror()];
else {
    char* tmpStr = func();
    responseField.text = [NSString stringWithUTF8String:tmpStr];        
}
}
else {
responseField.text = [NSString stringWithUTF8String:dlerror()];
}

当它执行时,responseFiled.text设置为dlsym(...): symbol not found。这意味着dlopen有效但无效dlsymnm我使用并看到存在的二进制文件中的符号_getstring。我检查了手册dlsym它说我不应该在名称中添加下划线。无论如何添加它并不能解决问题。我究竟做错了什么?

我在这里问过一个关于在 Objective-C 中按名称调用函数的类似问题,然后在 Mac 上按照答案成功尝试,所以这个问题似乎是 iOS 特有的。

4

2 回答 2

2

我认为问题在于 iOS 不支持 dlopen,即使您静态链接库也是如此。你应该可以使用

dlsym(RTLD_SELF, "getstring");

因为 RTLD_SELF 的意思是“开始查看名为 dlsym 的图像”。根据您使用 dlopen() 的方式,它应该完成同样的事情。

于 2012-03-14T15:04:52.937 回答
1

其实我也有一些成功的经验,和你类似的案例。我曾经dlsym(RTLD_MAIN_ONLY, "getstring")获取函数指针。

请注意,您的getstring符号必须适合动态链接:可以使用

nm -m <application>

你的符号必须是external(不是non-external)。

我还不太确定确保符号标记为external.

于 2012-04-07T21:25:11.440 回答