2012-03-21 12 views
0

私のアプリケーションの特定のモジュールに古いバージョンのlibcを使用させるにはどうすればよいですか?2つのバージョンのlibcを同じアプリケーションにリンクするにはどうすればいいですか?

アプリケーションにリンクする必要がある.soファイルが2つありますが、そのうちの1つは古いバージョンのlibcでのみ動作し、1つは新しいバージョンでのみ動作します。

私はソースを持っていますが、これまでのところエラーの原因を突き止めて失敗しました。私はそれが確かに正しい修正であるので、その検索を停止していません。

リンカがアプリケーションのその部分だけ古いlibcを使用するように強制する措置は一時的なものですか?

静的にリンクしたり、シンボリックリンクを設定しても問題ありません。

更新/明確化:

私は、これはコードベースを変更せずに実現するためにしようとしています。この非常に特殊な.soファイルでは、libcシンボルはlibcの古いコピーを指すようにしなければならないことをリンカに伝える方法を理解したいと思います。

実際のバグを見つけたとしても、これは自分の面白い十分なチャレンジのようです。

これも可能ですか?

おかげ

答えて

1

は技術的には、あなたは動的にdlsymをして、それから、シンボルのアドレスを取得し、その後のdlopenで代替ライブラリをロードすることができます。これにより、関数のアドレスを取得し、デフォルトのコードではなくコードを呼び出すことができます。例えば、linker documentation pageを参照してください。

しかし、これは影響を受けるコードのサイズと最悪の場合、標準Cライブラリの低レベル性とそれが示唆することがある競合/不一致を考慮すると、実装するには少なくとも複雑になります。

あなたのコード(あるいはlibcの)と間違って何を理解することは間違いなく

より良いアプローチでしょう更新

シンボルのための単一の名前空間はとても私の知る限りがあり、なしありコード起源に応じてシンボルを解決する方法を教える方法。あなたは間違いなく、私が提案する方法でコードを修正する必要があります。

また、それぞれのlibcにリンクされた2つのプログラムでコードを分割し、ソケット、共有メモリなどを介して通信するようにしても構いませんが、コードを書き直す(ここでは再構築する)必要があります。

+0

注目のリンク、よろしくお願いいたします。明らかにバグを見つける正しい解決策ですが、それは問題のポイントではありません。 :)これはコンパイラのフラグレベルで行うことができますか? (元の投稿を更新します) – nonot1

関連する問題