2012-05-04 2 views
2

ここに状況があります。私は多くの場所で壊れている古いレガシーライブラリを持っていますが、多くの重要なコードが組み込まれています(ソースはなく、lib +ヘッダのみです)。このライブラリによって公開されている関数は、特別な方法で処理しなければならず、いくつかのポストや前処理や処理が悪くなります。私が思うのは、この古いライブラリを使用する別のライブラリを作成し、「安全」な新しい関数セットを公開することです。ライブラリ内のライブラリを非表示にする

私はすぐにこの新しいライブラリの作成を試み、それをメインプログラムにリンクしました。しかし、それはまだ新しいライブラリを通して公開されている古いライブラリのシンボルにリンクしています。

これらの機能を使用しないように人々に頼むことは明らかですが、何らかの方法でそれらを隠すことができれば、安全機能を晒すだけで、それはさらに優れています。

可能ですか?代替案?

(それはARMマイクロコントローラ上で実行している。ファイル形式はELFで、OSはそのコンパイラを使用して、Keil社からのRTOSである)

[更新]

は、ここに私がやってしまったものです私は新しいライブラリ内に古いものと同じプロトタイプを使用するダミー関数を作成しました。新しいライブラリをメインプログラムにリンクし、他の開発者が古いライブラリの "悪い"機能を使用しようとすると、 "abcdシンボルが複数定義されている(old_lib.oとnew_lib.oによって)ビルドを中断します。 [アップデート2]

...政府の仕事のために十分に良い私は実際にIDE = P、はるかに優れたソリューションを通じてそれらをリンクする際、私は手動でライブラリのコンポーネントを非表示にすることができていることが分かりました。ここでスペースを取って申し訳ありません。

+0

どのオペレーティングシステムですか?リンケージ機能は実行可能ファイル形式に依存します。実行形式はオペレーティングシステムによって異なります。 – zneak

+1

シンボルテーブルを見て人々があなたのライブラリに対してプログラミングしている場合、深刻なソフトウェア開発プロセスの問題があります。古いlibの開発者用インターフェイスを公開しないでください。 – John3136

+0

これは実際にはARMマイクロコントローラで実行されています。ファイル形式はELFで、OSはKeilのRTOSでコンパイラを使用しています。 – Piotr

答えて

1

GNU binutilsを使用している場合、objcopyには、すべてのシンボルの前に任意の文字列を付けることができます。

今、あなたはfoo()の元のバージョンを呼び出すためにbrokenlib_foo()を使用:ちょうど(new.soを省略すると、old.soが上書きされることになります!注意してください)objcopy --prefix-symbols=brokenlib_ old.so new.soを使用しています。

+0

もう一つのオプションは、古いlibの関数をフックすることですが、それはあまり隠されていません。 –

+0

これはIDEソリューションの代わりに私のアプローチでしたが、うまく機能しました。 – Piotr

1

あなたの代わりにldのライブラリをコンパイルしてリンクするlibtoolを使用する場合は、出力シンボルを制御するために-export-symbolsを提供することができますが、あなたの古いライブラリを静的にリンクすることができます場合にのみ動作します。動的にリンクされている場合(.so.dylib、または.dll)、これはできません。

関連する問題