У меня есть некоторые проблемы при использовании API динамической загрузки (<dlfcn.h>
: dlopen()
, dlclose()
и т.д.) на Android.
Я использую автономную инструментальную цепочку NDK (версия 8) для компиляции приложений и библиотек.
Версия Android 2.2.1 Froyo.
Вот исходный код простой общей библиотеки.
#include <stdio.h>
int iii = 0;
int *ptr = NULL;
__attribute__((constructor))
static void init()
{
iii = 653;
}
__attribute__((destructor))
static void cleanup()
{
}
int aaa(int i)
{
printf("aaa %d\n", iii);
}
Вот исходный код программы, который использует указанную библиотеку.
#include <dlfcn.h>
#include <stdlib.h>
#include <stdio.h>
int main()
{
void *handle;
typedef int (*func)(int);
func bbb;
printf("start...\n");
handle = dlopen("/data/testt/test.so", RTLD_LAZY);
if (!handle)
{
return 0;
}
bbb = (func)dlsym(handle, "aaa");
if (bbb == NULL)
{
return 0;
}
bbb(1);
dlclose(handle);
printf("exit...\n");
return 0;
}
В этих источниках все работает нормально, но , когда я пытаюсь использовать некоторые функции или классы STL, программа вылетает с ошибкой сегментации, когда функция main()
завершается, например, при использовании этот исходный код для общей библиотеки.
#include <iostream>
using namespace std;
int iii = 0;
int *ptr = NULL;
__attribute__((constructor))
static void init()
{
iii = 653;
}
__attribute__((destructor))
static void cleanup()
{
}
int aaa(int i)
{
cout << iii << endl;
}
С помощью этого кода программа вылетает с ошибкой сегментации после или во время выхода функции main()
.
Я пробовал пару тестов и нашел следующие результаты.
- Без использования STL все работает нормально.
- При использовании STL и не вызывайте
dlclose()
в конце, все работает нормально. - Я попытался скомпилировать с различными флагами компиляции типа
-fno-use-cxa-atexit
или-fuse-cxa-atexit
, результат будет таким же.
Что не так в моем коде, который использует STL?