심볼

2012-12-17 6 views
1

을 해결할 수 없습니다. 임베디드 시스템 용 프로그램을 크로스 컴파일하고 있습니다. 이 프로그램은 공유 라이브러리를 사용하는데, 나는 이것을 openend한다.심볼

#include <stdio.h> 
#include <stdlib.h> 
#include <dlfcn.h>  //needed for dynamic linking 

void *FunctionLib;  //Handle to shared lib file 
int (*Function)(); //Pointer to loaded routine 
const char *dlError; //Pointer to error string 

int main(argc, argv) 
{ 
    int rc;    //return codes 
    printf("start...\n"); 

    //Open Dynamic Loadable Libary with absolute path 
    FunctionLib = dlopen("/lalabu/sharedLib.so",RTLD_LAZY | RTLD_GLOBAL); 
    dlError = dlerror(); 
    printf("Open sharedLib.so returns: %s \n", dlError); 
    if(dlError) exit(1); 

    //Find function 
    Function = dlsym(FunctionLib, "getSomething"); 
    dlError = dlerror(); 
    printf("Find symbol getSomething returns: %s \n", dlError); 
    if(dlError) exit(1); 
... 

나는 경고 및 재료없이 작동 다음 명령

mips-linux-uclibc-gcc -Wall -ldl ./dynamic_linking.c -o /dynamic_linking 

으로 코드를 컴파일하고있다.
난 지금 내 장치에이 코드를 실행하려고하면, 나는 다음과 같은 오류 얻을 : 내가 sharedLib.so 가져올 원하는 기능 IDA로 살펴 경우

# ./dynamic_linking 
start... 
Open sharedLib.so returns: (null) 
Find symbol getSomething returns: Unable to resolve symbol 
./dynamic_linking: can't resolv '_ZNSt8ios_base4InitD1Ev' 

을, 나는 함수를 참조하십시오 (또는 기호 ?) '_ZNSt8ios_base4InitD1Ev'그리고 어디에 있어야하는지 (libc.so.0).
IDA를 사용하여 libc.so.0을 다시 살펴 본다면 이와 같은 함수가 표시되지 않습니다. ios_base, ios 또는 base와 같은 것도 없습니다.
는 I 위의 에러 난 또한 제가 시도 제가

Segmentation fault (core dumped) 

대신

./dynamic_linking: can't resolv '_ZNSt8ios_base4InitD1Ev' 

얻는 대신 RTLD_LAZY의 RTLD_NOW를 사용할 때를 제외하고 항상 결과는 dlopen()와 이미 각종 플래그의 조합을 시도 rdynamic과 같은 몇 가지 gcc 연결 옵션은 항상 동일한 결과를 제공합니다.
또한 _zNSt8ios_base4InitD1Ev, 내 c- 코드가 작동하는지 확인하려면 'libc.so.0'을 사용하지 않는 공유 라이브러리를 사용하려고했습니다. 이름과 절대 경로 만 변경하고 찾기 기능 부분을 삭제했습니다. 오류없이 작동했습니다.
내 게시물에서 알 수 있듯이, 나는 크로스 컴파일과 동적 라이브러리를 사용하기 시작 했으므로 아마도 내 잘못은 다른 곳에서있을 수 있습니다. 게다가 문제가있는 곳을 이해할 지 모르겠다. 그래서 어떤 힌트라도 환영 받는다. 더 자세한 정보가 필요하시면, 그들에게 기꺼이 드릴 것입니다.
Greetings, Pingu

답변

3

_ZNSt8ios-base4InitD1Ev은 C 기호가 아니라 C++ 기호입니다. 당신이 _- 교체 할 경우

$ echo _ZNSt8ios-base4InitD1Ev | c++filt 

는 단서를 제공하지 않지만 (아마도 오타?) :

$ echo _ZNSt8ios_base4InitD1Ev | c++filt 
std::ios_base::Init::~Init() 

는 그래서는 C++ STD 라이브러리의 내부 클래스의 소멸자이다. 따라서 라이브러리를 확인해야합니다 (libc.so).

제 조언은 G ++를 사용하여 프로그램을 컴파일하기 만하면 C++ 라이브러리가 제대로 초기화됩니다. 동적으로로드 할 의도가 없으므로 세그먼트 화 오류가 발생합니다.

+0

답변을 주셔서 감사합니다. mips-linux-uclibc-cpp -Wall ./dynamic_linking.c -o ./dynamic_linking을 사용하여 프로그램을 컴파일했으며 오류가 발생해도 컴파일되었습니다. 장치에서 작동하는지 내일 확인할 수 있습니다. 피드백을 드릴 것입니다. _ 대신 _는 실제로 오타였습니다. 미안합니다. – Pingu

+0

@Pingu :하지만 조심해! 'cpp'는 GCC C++ 컴파일러의 이름이 아니며 ('g ++'또는'C++'이 될 것입니다.) C 사전 컴파일러의 이름입니다. 'dynamic_linking' 프로그램이 프리 컴파일러의 출력이 될 경우 재미있을 것입니다 ! – rodrigo

+0

내 장치에는 gcc C++ 컴파일러가 없지만이 게시물을 읽는 것은 http : // stackoverflow입니다.com/questions/6626363/why-use-g-of-gcc-to-compile-cc-files 나는 C++ std 라이브러리를 사용하여 gcc로 코드를 컴파일하는 것이 가능하다고 생각한다. 나는 그것을 알아 내려고 노력할 것이다. – Pingu