2011-08-11 11 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 

そしてもちろん私のプログラムのセグメンテーション違反:

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()と誤って宣言されている可能性が高いです。

#include <dlfcn.h>dlsym()を使用するファイルに追加すると、正しい宣言が得られ、正しく動作するはずです。

+0

'-Werror = prototypes'でもgccを起動したいかもしれません。 –

+0

うん、それだよ、私は忘れた。うわー、どのように恥ずかしい!とりあえずありがとう! –

関連する問題