Вызов функции по имени с помощью dlsym в iOS
Я не могу вызвать функцию по имени в iOS? У меня есть функция C называется 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
работает но не dlsym
, Я сбросил символы в двоичном nm
и увидел, что _getstring
настоящее. Я проверил руководство для dlsym
и это говорит, что я не должен добавлять подчеркивание к имени. Добавление его не решает проблему в любом случае. Что я делаю неправильно?
Я задал подобный вопрос о вызове функций по имени в Objective-C, а затем успешно попробовал его на Mac, следуя ответам, так что эта проблема, похоже, специфична для iOS.
2 ответа
Я считаю, что проблема в том, что dlopen не поддерживается в iOS, даже если вы статически связываете свои библиотеки. Вы должны быть в состоянии использовать
dlsym(RTLD_SELF, "getstring");
потому что RTLD_SELF означает "начать искать в образе, который называется dlsym". Исходя из того, как вы используете dlopen(), он должен выполнить то же самое.
У меня действительно был успешный опыт в деле, похожем на ваше. я использовал dlsym(RTLD_MAIN_ONLY, "getstring")
чтобы получить указатель на функцию.
Обратите внимание, что ваш getstring
Символ должен подходить для динамического связывания: это можно проверить с помощью
nm -m <application>
Ваш символ должен быть external
(не non-external
).
Я еще не слишком уверен в процедуре, чтобы гарантировать, что символы помечены как external
,