2012-06-06 3 views
0

데몬 (deamon)에 의해 생성되는 스크립트 인터프리터가 있는데 항상 작동해야합니다. 즉, 다운 (충돌, 세그 폴트, 정상 종료 등)이 발생하면 데몬이이를 다시 생성합니다.dlopen 기반 응용 프로그램이 두 번째로 다르게 (오류가 있습니다) 실행됩니다.

이 해석기는 dlopen (lib1)을 사용하여 라이브러리를 동적으로 엽니 다. 이 라이브러리는 많은 다른 라이브러리 (lib2, lib3, ...)를 엽니 다. 그들 중 일부는 첫 번째 라이브러리를 참조합니다. 그래서 dlopen 호출에 RTLD_GLOBALRTLD_NOW 플래그를 사용하고 있습니다.

지금까지 모든 것이 잘 작동합니다.

인터프리터가 죽거나 충돌하여 다시 생성 될 때 문제가 발생합니다. dlopen을 다시 사용하면 문제가 없습니다 ... lib1의 기능을 정상적으로 호출 할 수 있습니다. lib1의 코드에서 나는 lib2에서 함수를 호출합니다. 프로그램이 멈 춥니 다.

충돌이없는 것 같습니다 (segfault 또는 무언가). 호출 직전에 디버그 호출이 있고 함수의 첫 번째 줄에 다른 호출이 있습니다. 첫 번째가 실행됩니다. 두 번째는 그렇지 않습니다.

마지막 세부 사항 : lib1은 실제로 개체 인스턴스를 반환하는 C++ 라이브러리입니다. lib1에서 파괴자 방법을 생략하고 모든 모듈의 모든 헤더를 생략합니다. 누군가가 중요하다고 판단하면 더 많은 정보를 제공 할 수 있습니다.

어떤 일이 일어나고 있는지 알 수있는 사람이 있습니까? 나는이 문제를 의심

lib2_do_something() { 
    printf("Check point 2.\n"); 
    return 1; 
} 

:

통역 :

Lib1_obj *instance; 

void interpreter_start() { 
    // dlopen lib1 
    // get lib1_creator symbol. 
    instance = lib1_creator(); 
} 

void interpreter_on_event_X() { 
    int x = instance->method1(); 
    printf("x = %d\n", x); 
} 

LIB1 :

class Lib1_obj { 
public: 
    int method1() { 
    printf("Check point 1.\n"); 
    return lib2_do_something(); 
    } 
} 

Lib1_obj * creator() { 
    return new Lib1_obj(); 
} 

LIB2 시나리오를 ilustrate하기

은 "의사"코드를 고려 somet있다 프로세스가 종료되면 dlclose으로 전화 할 수 없다는 사실과 관련이 있습니다. 그것이 dlopen 메커니즘을 엉망으로 만들 가능성이 있습니까?

대단히 감사합니다.

+0

프로세스 내에서 _process_가 종료되었거나 세션이 일부 표시 되었습니까? – sarnold

+0

프로세스가 종료되면 라이브러리가 자동으로 dlclose됩니다. 문제에 관해서는 - 당신이 두 번째로 올바르게 시작하는 문제에 집중하기로 결정한 동안, 나는 개인적으로 처음부터 충돌하지 않는 것에 집중할 것입니다. – mah

+0

그게 문제 야. 저것을 부수 지 말라. directfb를 사용합니다. 그리고 나는 directfb를 정확하게 finiteize 할 수 없다.이 모듈에서는 작동하지 않지만 올바르게 닫을 수있는 유일한 방법은 프로세스를 강제 종료하는 것입니다. 프로세스를 종료해도 두 번째 실행시 다른 동작이 발생할 수 있습니다. – Marcus

답변

0

-fPIC 옵션으로 컴파일되지 않은 lib가 있습니다. 이렇게하면 문제가 해결됩니다.

도움에 감사하는 user315052.

관련 문제