Вызов функции по имени с помощью 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,

Другие вопросы по тегам