ARMv7: 라이브러리에서 예외가 발생하면 "활성 예외 없이 호출을 종료합니다"

ARMv7: 라이브러리에서 예외가 발생하면 "활성 예외 없이 호출을 종료합니다"

저는 gcc 4.9.2를 사용하여 armv7hv(gcc-4.9.2_armv7hf_glibc-2.9)를 크로스 컴파일하고 있습니다. 주요 실행 파일과 내보낸 함수가 있는 라이브러리가 있습니다 Foo().

제 경험으로는 해당 라이브러리의 함수에서 예외를 던지고 Foo()즉시 잡으려고 하면 잡히는 것입니다.

하지만해당 함수에서 std::Exception을 발생시키는 스택에 객체를 생성하는 경우 해당 객체는 포착되지 않고 다음 출력을 얻고 프로그램이 즉시 종료됩니다.

terminate called without an active exception
Aborted

다음은 내 컴파일러 호출입니다.

arm-drm-linux-gnueabihf-g++ -fPIC -pipe -ggdb -o MyLib.o -c MyLib.cpp
arm-drm-linux-gnueabihf-g++ -fPIC -pipe -ggdb -o LibraryLoader.o -c LibraryLoader.cpp
arm-drm-linux-gnueabihf-g++ -g3 -ggdb -Wall -fPIC -pipe -isystem /sysroot/usr/local/include\ -fsigned-char -D_USE_EMBEDDED_ -ffunction-sections -fdata-sections -static-libstdc++ -lpthread -ldl -shared -L/sysroot/usr/local/lib MyLib.o LibraryLoader.o -o myLib.so

arm-drm-linux-gnueabihf-g++ -fPIC -pipe -ggdb -o Main.o -c Main.cpp
arm-drm-linux-gnueabihf-g++ -g3 -ggdb -Wall -fPIC -pipe -isystem /sysroot/usr/local/include\ -fsigned-char -D_USE_EMBEDDED_ -ffunction-sections -fdata-sections -static-libstdc++ -lpthread -ldl -L/sysroot/usr/local/lib  Main.o -o Main.linux-arm

이것은 내 코드입니다.

메인 프로그램.cpp

#include <iostream>
#include <stdlib.h>
#include <dlfcn.h>
#include <stdio.h>

int main(int argc, char* argv[])
{
    std::string sLibname("myLib.so");
    std::string sInitFuncName = "Foo";

    void *handle = NULL;
    long (*func_Initialize)(void*);
    char *error;

    handle = dlopen(sLibname.c_str(), RTLD_LAZY | RTLD_LOCAL);

    if (!handle) {
        fputs(dlerror(), stderr);
        exit(1);
    }

    *(void**)(&func_Initialize) = dlsym(handle, sInitFuncName.c_str());

    if ((error = dlerror()) != NULL) {
        fputs(error, stderr);
        exit(1);
    }

    printf("Call library function 'Foo'\n");
    func_Initialize(NULL);
    printf("Call library function 'Foo' DONE\n");

    dlclose(handle);
    return 0;
}

MyLib.hpp

extern "C" {
long DEBMIInitialize();
}

MyLib.cpp

#include "LibraryLoader.hpp"
#include "MyLib.hpp"
#include <stdio.h>
#include <exception>

long Foo()
{

    try {
        std::exception e;
        throw e;
    }
    catch (std::exception)
    {
        //This is caught
        printf("Caught std::exception\n");
    }



    try {
        LibraryLoader oLibLoader;
        oLibLoader.Run();
    }
    catch (std::exception)
    {
        //This is not caught
        printf("Caught std::exception from ClLibrayLoader\n");
    }

    return 0;
}

라이브러리 로더.hpp

#include <exception>
#include <stdio.h>

class LibraryLoader
{
public:
    LibraryLoader() {};
    ~LibraryLoader() {};
    void Run() {
        std::exception e;
        throw e;
    };
};

-O1O2편집: 최적화를 위해 컴파일러 플래그( , .. ) 를 추가하면 O3(두 번째) 예외도 포착된다는 사실을 방금 확인했습니다.

답변1

예외는 "MyLib.cpp::Foo()"에 로컬이므로 new()를 사용하여 예외를 생성해야 할 수도 있습니다.

관련 정보