3

나는 추상적 인 방법으로 문제를 공식화하려했지만, 결국 실제 라이브러리에 대한 세부 정보를 제공합니다.중복 된 동적 및 정적 링크 (Firefox Add-on, WebRTC 및 VP8)

동적 라이브러리 Addon 정적으로 다른 라이브러리 어셈블리의 일부 코드가 WebRTC에 링크되어 오브젝트가 WebRTC의 자신의 오브젝트 파일과 함께 파일로이 코드는 WebRTC로 연결되어 있습니다. 이 어셈블리 코드 VP8을 호출 할 수 있습니다. VP8의 기능은 WebRTC 안에 extern으로 표시됩니다. 일부 기능 Encode()Addon에서 WebRTC의 기능을 호출하며 결국 VP8에서 기능을 호출합니다.

이제 라이브러리 Addon를로드하는 것입니다 응용 프로그램 Firefox은 매우 복잡하고 라이브러리 WebRTC의 (정적으로 링크 된 의미) 자신의 버전이 (의이 WebRTC2를 부르 자), 그러나 이전 하나.

그래서, 여기에 문제가 있습니다 : Encode()의 통화가 응용 프로그램 Firefox 만든 경우 WebRTC 시도가 VP8 함수를 호출 할 때, WebRTC 기능 (올바르지 않습니다 WebRTC2) 하지만을 호출되는, 그들은에서 호출되는 WebRTC2 버전 (응용 프로그램의 버전은 WebRTC을 의미 함)은 WebRTC이 아니라.

WebRTCVP8의 로컬 복사본에서만 전화를 걸 수 있습니까?

응용 프로그램 Firefox는 파이어 폭스 브라우저, WebRTC는 WebRTC가 라이브러리, VP8은 (WebRTC가 내부)는 VP8 코덱 라이브러리 및 Addon 내 파이어 폭스는 C++ 추가합니다. -

UPDATE 상세한 설명

가 여기에 문제의 "unabstract"설명입니다 가 그래서 C가 ++ XPCOM 추가에있는 정적의 WebRTC 라이브러리의 최신 버전에 연결되어 있습니다. 애드온 내부의 어떤 지점에서 프레임 인코딩을위한 호출이 이루어지며 (방법 EncodeVP8Encoder 클래스) 항상 Firefox에서 충돌하며 gtest 프레임 워크를 사용하는 테스트 프로그램에서 계속 작동합니다.

WebRTC 내부의 어떤 지점에서이 어셈블리 코드의 인코딩 및 기능을 호출하는 VP8 어셈블리 코드가 구현 파일에 extern으로 선언되어 있습니다. 실제로, 그것은 vp8_intra_pred_y_ve_sse2 함수에서 충돌합니다. 필자는이 함수의 세 가지 어셈블리 코드를 비교했습니다. 하나는 WebRTC (애드온에 사용)의 두 번째 버전이고 다른 하나는 디버거가 충돌 한 곳이며 세 번째는 Mozilla의 WebRTC 소스 코드입니다.

모질라의 코드가 애드온의 WebRTC 대신에 호출되는데 (둘 다 같은 이름의 코스가 있음) Mozilla의 WebRTC 코드가 오래된 것으로 밝혀지면서 EXC_BAD_ACCESS와 충돌합니다.

+0

사실, 물건을 "unabstract"하려고하십시오. 머리 글자에서 계속 추적 할 필요가있는 단일 문자 이름 대신 실제 이름을 사용하는 것이 이해하기 쉽습니다. (나는 결국 이해했지만 제공 할 답변은 없습니다). 또한, 물건이 어떻게 빌드 (링크)되고 어떤 메커니즘 (윈도우 DLL 로더, ld 등)을로드 할 것인가와 같은 많은 세부 사항을 생략했는데, 이것들은 모두 달라질 수 있습니다 ... 또한, 이것은 파이어 폭스 애드온 (firefox addon) 문제처럼 보이지만, 일반적인 동적 로더 문제와 비슷합니다. – nmaier

+0

예, 일반적인 문제입니다. 그럼에도 불구하고 세부 정보로 설명을 업데이트했습니다. – peetonn

답변

1

이것은 아마도 당신에게 큰 도움이되지 않습니다,하지만 다른 사람이 반응하지 않았기 때문에, 여기 당신이 리눅스, 윈도우, 또는 뭔가 실행하는 경우

당신은 언급하지 않았다 ... 이동 그밖에. 내 대답은 리눅스입니다. Windows 동적 라이브러리 다르게로드 할 믿습니다.

필자는 WebRTC 라이브러리 스텁 인터페이스에 정적으로 링크되어 있고 그 스텁 인터페이스가 실제 구현에 동적으로 연결되어 있고 WebRTC 라이브러리의 첫 번째 인스턴스를 두 번째 대신 파이어 폭스에로드했다고 생각합니다. . 실제로 WebRTC 라이브러리의 정적으로 컴파일 된 버전과 연결되어 있는지 확인하십시오.

void *dlopen(const char *filename, int flag); 

dlopen을()

The function dlopen() loads the dynamic library file named by the null- 
    terminated string filename and returns an opaque "handle" for the 
    dynamic library. [...] 

    RTLD_DEEPBIND (since glibc 2.3.4) 

     Place the lookup scope of the symbols in this library ahead of 
     the global scope. This means that a self-contained library will 
     use its own symbols in preference to global symbols with the 
     same name contained in libraries that have already been loaded. 
     This flag is not specified in POSIX.1-2001. 
:

리눅스 dlopen(3) 매뉴얼 페이지 라이브러리는 WebRTC가 라이브러리를로드하는 사람이라면이 도움이 될 것 같아 나와 흥미 플래그가

불행히도 firefox는 라이브러리를로드하는 파일입니다.

라이브러리가 WebRTC에 동적으로 링크되어 있고 (해당되는 것처럼) RTLS_DEEPBIND 플래그와 함께 dl_open()을 사용하여 원하는 WebRTC 라이브러리를 명시 적으로로드 한 경우 문제가 해결 될 것입니다.

vp8_intra_pred_y_ve_sse2에 결합하는 것이 아니 코드 때문에 많은 도움이,하지만하지 않습니다 그 GCC는 특수 플래그의 몇 취할 수있는 dlsym() 기능이 있음을 지적 가치 :

void *dlsym(void *handle, const char *symbol); 

dlsym을()

The function dlsym() takes a "handle" of a dynamic library returned by 
    dlopen() and the null-terminated symbol name, returning the address 
    where that symbol is loaded into memory. [...] 

    There are two special pseudo-handles, RTLD_DEFAULT and RTLD_NEXT. The 
    former will find the first occurrence of the desired symbol using the 
    default library search order. The latter will find the next occurrence 
    of a function in the search order after the current library. This 
    allows one to provide a wrapper around a function in another shared 
    library. 
당신은 당신의 코드에서 그것을 사용할 수

에가를 인쇄함으로써 무슨 일이 일어나고 있는지 적어도 디버그 vp8_intra_pred_y_ve_sse2 조회를 위해 얻은 값. 그것은 나를라면

#define _GNU_SOURCE   /* See feature_test_macros(7) */ 
    #include <dlfcn.h> 

    void *dlvsym(void *handle, char *symbol, char *version); 

:

마지막으로, 같은 man 페이지는 리눅스가 XPCOM 코드는 원하는 기능의 버전을 지정할 수뿐만 아니라 버전 문자열 인수를 취하는 dlvsm()을 가지고 있다고 지적 , 그리고 나는 물건들을 동적으로 연결시켜야했다. 나는 무차별 공격 방식을 사용했다. 라이브러리로 가서 함수 이름을 변경하십시오 (두 라이브러리 모두에서). 그것의 우아하고, 어느 쪽의 도서관이라도의 새로운 버전이 나올 때마다 그것은 두통 일 것이다. 그러나 그것의 단순하고 직접적인.