Calling function by name using dlsym in iOS

六月ゝ 毕业季﹏ 提交于 2019-12-06 06:51:39

问题


Can't I call a function by name in iOS? I have a C function called getstring. I am calling it as follows:

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()];
}

When this executes, responseFiled.text is set to dlsym(...): symbol not found. This means dlopen works but not dlsym. I dumped the symbols in the binary using nm and saw that _getstring is present. I checked the manual for dlsym and it says I should not add an underscore to the name. Adding it does not solve the issue anyway. What am I doing wrong?

I had asked a similar question here about calling functions by name in Objective-C and then tried it successfully on a Mac following the answers, so this problem seems to be specific to iOS.


回答1:


I believe the problem is that dlopen is not supported on iOS, even if you statically link your libraries. You should be able to use

dlsym(RTLD_SELF, "getstring");

because RTLD_SELF means 'start looking in the image that called dlsym'. Based on how you're using dlopen() it should accomplish the same thing.




回答2:


I've actually had some successful experiences in a case similar to yours. I used dlsym(RTLD_MAIN_ONLY, "getstring") to get the function pointer.

Note that your getstring symbol must be suitable for dynamic linking: this can be checked using

nm -m <application>

Your symbol must be external (not non-external).

I'm not yet too sure about the procedure to ensure that symbols are marked as external.



来源:https://stackoverflow.com/questions/5040433/calling-function-by-name-using-dlsym-in-ios

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!