0

コードがライブラリから特定のシンボルを参照している場合、リンクを失敗させる方法はありますか?

リンカスクリプト言語にそのようなディレクティブがあったことはうろ覚えのようですが、どうやらGNU LDではなかったようです(記憶違いかもしれません)。

サードパーティ ライブラリの一部が誤ってアプリケーションにリンクされるのを防ぐために必要です。リンクする場合、実行時に大混乱を引き起こす静的初期化子がいくつか追加されます (これは組み込みプロジェクトであるため、環境は少し風変わりです)。問題のサードパーティ ライブラリを変更できません。ビルド時にエラーを検出したいと思います。マップ ファイルを解析し、問題のある部分が見つかった場合にエラーを発行するビルド後のスクリプトを作成できると思いますが、上記の [false?] メモリにより、リンカーだけでは実行できないことを確認するよう求められます。

GNU GCC ツールチェーンを使用しています。

4

1 に答える 1

0

さて、昼食に出かけることで、この(かなり明白な)解決策を見つけることができました:

/* stubs.c */

void ERROR_DO_NOT_REFERENCE_THIS_SYMBOL( void );

void Offending3rdPartyFunction( void )
{
    ERROR_DO_NOT_REFERENCE_THIS_SYMBOL();
}

ここでは、シンボルERROR_DO_NOT_REFERENCE_THIS_SYMBOLは定義されていません。追加のソース ファイルがプロジェクトに追加され、参照してはならない関数ごとに上記のようなスタブが追加されます。コードがこれらの関数のいずれかを参照する場合、スタブはライブラリ提供のシンボルよりも優先され、リンクは失敗します。

test.cpp:(.text._TestFunc+0x4): undefined reference to `ERROR_DO_NOT_REFERENCE_THIS_SYMBOL()'
collect2.exe: error: ld returned 1 exit status
于 2014-11-13T10:31:12.930 に答える