2011-08-11 7 views
0

나는 여기에서 질문하는 것을 정말로 싫어한다. 그러나 나는 some of the other posts을보고 있었고이 솔루션과 같은 솔루션은 작동하지 않는 것 같습니다. 아마 구문에 대한 오해.Dlsym : 다른 크기의 정수에서 포인터로 캐스트

나는 내 오래된 코드를 향상시키고있다. 질문에있는 함수는로드 된 일부 모듈을 순환하고 함수를 실행합니다. 이 코드는 제가 x86에 있었을 때 완벽하게 작동했지만 64 비트로의 점프는 모든 것을 망쳐 놨습니다.

exec/src/input.c:98:18: warning: cast to pointer from integer of different size 

물론 내 프로그램 세그먼테이션 폴트 (segfault) :

int FindCmd(ArgS *Args) 
{ 
    /* We need to check our loaded modules for the appropriate command. */ 
    int found = 0; 

    ModS *Current; 

    for(Current = Modules; Current != NULL; Current = Current->Next)  
    { /* Cycle through the modules. */ 

     int (*OnConsoleCmd)(RootS *IRC, ArgS *Args, McapiS *Mcapi); 

     /* The below statement is the problem. */ 
     OnConsoleCmd = (int (*)(RootS *, ArgS *, McapiS *))dlsym(Current->Handle, "OnConsoleCmd"); 
     /* The above statement is the problem. */ 

     if(OnConsoleCmd != NULL) 
     { 
      if(OnConsoleCmd(IRC, Args, Mcapi) != 0)  /* Run command. */ 
       found++; 
     } 
    } 

    return found; 
} 

나는 다음과 같은 경고를 얻을. 이것이 캐스팅 문제 일 뿐이라는 것을 알고 있지만, 쉽고 이식 가능한 솔루션을 모르겠습니다. 더 이상 정보가 필요하면 알려주세요. 감사.

+1

여기에서 묻는 질문은 싫어서는 안되며, 이는 주로이 웹 사이트의 목적입니다. – dreamlax

+0

@dreamlax : 싫어하고 싫어하는 것에는 차이가 있습니다. 당신이 미숙 한 것에 건설적으로 불만을 품는다는 것을 의미해야한다는 것을 싫어합니다. 미워하는 것은 실제로 개선해야 할 도움을 요청하는 것을 꺼려한다는 것을 의미합니다. –

답변

3

범위에 dlsym()의 프로토 타입이 없기 때문에 가능성이 높습니다. 따라서 암시 적으로 int dlsym()으로 잘못 선언되었습니다.

dlsym()을 사용하는 파일에 #include <dlfcn.h>을 추가하면 올바른 선언을 얻게되고 올바르게 작동합니다.

+0

'-Werror = prototypes'와 함께 gcc를 호출 할 수도 있습니다. –

+0

네, 그게 다예요. 을 잊어 버렸습니다. 와우, 얼마나 당황 스럽습니까! 어쨌든 감사합니다! –