Tôi gặp một số sự cố khi sử dụng API tải động (<dlfcn.h>
: dlopen()
, dlclose()
, v.v.) trên Android. Tôi đang sử dụng chuỗi công cụ độc lập NDK (phiên bản 8) để biên dịch các ứng dụng và thư viện. Phiên bản Android là 2.2.1 Froyo.Lỗi phân đoạn khi sử dụng dlclose (...) trên nền tảng Android
Đây là mã nguồn của thư viện được chia sẻ đơn giản.
#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);
}
Đây là mã nguồn chương trình sử dụng thư viện được đề cập.
#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;
}
Với những nguồn mọi thứ đều hoạt động tốt, nhưng khi tôi cố gắng sử dụng một số chức năng STL hoặc các lớp học, các chương trình bị treo với một lỗi segmentation, khi chức năng main()
lối thoát hiểm, ví dụ như khi sử dụng này mã nguồn cho thư viện được chia sẻ.
#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;
}
Với mã này, chương trình sẽ bị lỗi phân đoạn sau hoặc trong khi thoát chức năng main()
. Tôi đã thử một vài thử nghiệm và tìm thấy các kết quả sau.
- Nếu không sử dụng STL, mọi thứ đều hoạt động tốt.
- Khi sử dụng STL và không gọi
dlclose()
ở cuối, mọi thứ đều hoạt động tốt. - Tôi đã cố gắng biên dịch với các cờ biên dịch khác nhau như
-fno-use-cxa-atexit
hoặc-fuse-cxa-atexit
, kết quả là như nhau.
Có gì sai trong mã của tôi sử dụng STL?
+1 Câu hỏi được định dạng tốt;) –
Tiêu đề STL có trong tiêu đề của tệp đó không? Bạn có thể lấy nó chỉ để các tập tin cpp? (Vì vậy, STL sẽ không được trong giao diện.) Có phải định nghĩa và khai báo được tách ra? – Naszta
Tôi đoán bạn đang nói về hàm aaa (...), nếu có, thì khai báo và định nghĩa nằm trong các tệp khác nhau. Tệp tiêu đề định nghĩa là '#ifdef __cplusplus bên ngoài" C " #endif int aaa (int i);' –