2

これが状況です。私は多くの場所で壊れている古いレガシーライブラリを持っていますが、多くの重要なコードが組み込まれています(ソースはなく、lib +ヘッダーだけです)。このライブラリによって公開される関数は、「特別な」方法で処理する必要があります。後処理や前処理が行われると、問題が発生します。私が考えているのは、この古いライブラリを使用して、「安全」な新しい関数のセットを公開する別のライブラリを作成することです。

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

当然、これらの機能を使わないようにお願いすることもありますが、安全な機能だけを公開して、なんらかの方法で隠すことができれば、さらに良いでしょう。

出来ますか?代替案?

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

[アップデート]

最終的に行ったことは次のとおりです。古いライブラリと同じプロトタイプを使用するダミー関数を新しいライブラリ内に作成しました。新しいライブラリをメインプログラムにリンクしました。他の開発者が古いライブラリの「不良」関数を使用しようとすると、「シンボルabcd乗算定義(old_lib.oおよびnew_lib.o)」でビルドが中断されます。政府の仕事には十分です...

[update2] IDE = Pを介してライブラリのコンポーネントをリンクするときに、ライブラリのコンポーネントを手動で非表示にできることが実際にわかりました。これははるかに優れたソリューションです。ここでスペースを取ってすみません。

4

2 に答える 2

1

GNU binutilsを使用している場合は、objcopyすべてのシンボルの前に任意の文字列を付けることができます。使用するだけobjcopy --prefix-symbols=brokenlib_ old.so new.soです(注意:省略するnew.soold.so上書きされます!)

ここbrokenlib_foo()で、の元のバージョンを呼び出すために使用しますfoo()

于 2012-05-04T02:34:00.567 に答える
1

libtoolの代わりにライブラリのコンパイルとリンクに使用する場合は、出力シンボルを制御するように指定ldできます-export-symbolsが、これは、古いライブラリを静的にリンクできる場合にのみ機能します。動的にリンクされている場合(、、、.soまたは.dylib.dll、これは不可能です。

于 2012-05-04T01:41:35.630 に答える