2011-01-28 24 views
4

私はからLinuxODBCドライバを移植しています。
ドライバはCで書かれています。
Linuxでは、アプリケーションがODBCマネージャー(ODBCM)を呼び出すと、適切なドライバーがロードされ、関数呼び出しが渡されるということがODBCです。共有オブジェクトの関数名の衝突

私のドライバは、共有オブジェクトにコンパイルされ、ABという2つの関数を公開しているものとします。
がコール機能Aで、Aがコール機能Bであるとします。実際に起こっている何
関数A呼び出しは代わり機能B'B機能する場合(Bと同じ名前を持つ、libodbc共有オブジェクトに位置し、ODBCアプリケーションを使用Linuxによってロードされる)が呼び出されることです。

この問題を修正するコンパイル時フラグ、またはポストコンパイルライブラリの修正ツールが必要なような気がします。
は、現時点では、私は次の操作を実行時にライブラリを一つの機能を通じてつもりです:

_B(){ // rename old functions 
    ... 
} 
B() { // add new wrapper function 
    return _B(); // which just calls old 
} 

_A() { 
    ... 
    _B(); // Change calls to renamed functions 
    ... 
} 

変更することが遅く、クルージ感じます。

答えて

6

.so-Bsymbolicリンカーオプション(gccコマンドラインで-Wl,-Bsymbolicとする)にリンクしてみてください。これにより、リンク時にすべてのライブラリ内部シンボルがバインドされるので、あとで動的リンクを実行することはありません。

+0

これは問題を解決しました。ありがとう、私は手動で関数の名前を変更し、ラッパーを書く時間のトンを救った。 – TheGeneral

+0

「リンク時にすべてのライブラリ内部シンボルをバインドする」とは、この問題をどのように解決するかを説明できますか?このフラグが共有ライブラリから静的リンクを引き起こすと言っているようですが、それは正しいのですか?そして、このフラグにリンクされたプログラムは実行時に共有ライブラリにアクセスする必要はありませんか?あなたが応答する機会を得る前に、これを自分で見つけたら、私は編集を追加します。ありがとう。 – Praxeolitic