web-dev-qa-db-ja.com

gccにはELFバイナリファイルにバージョン情報を追加するオプションがありますか?

GccがソースコードバージョンのインフォアをセクションとしてELFバイナリに挿入できるかどうかを意味します。ソースファイルを変更したくないのですが、Makefileのgccオプションで情報を追加します。

22
Lane

バージョン情報をテキストファイルに出力し、そのテキストファイルをオブジェクトファイルに変換して、実行可能ファイルに静的にリンクすることができます。

最初のステップは簡単ですが、いくつかのコードを作成する必要があります。スクリプトなど、バージョン情報をプレーンテキストファイルとして任意の形式で書き込むためのものです。次に、 objcopy を使用して、version.txtからたとえばversion.oを生成するmakefileルールを記述します。これで、テキストバージョン情報の最初と最後の2つの便利な記号が定義されたオブジェクトファイルができました。生成されたオブジェクトを実行可能ファイルに追加すると、バイナリでstringsを実行するか、アプリケーションでコードを記述してバージョン文字列を出力するという2つの方法でバージョンにアクセスできます(必要になります)。開始記号と終了記号をヘッダーファイルの変数として宣言します)。

7
John Zwinck

ソースファイルを一度だけ変更してもかまわない場合は、次のようなものを追加します。

const volatile static char version[] = VERSION;

そしてコンパイル:

gcc -c -DVERSION='"1.2.3"'

volatileは、gccがより高い最適化レベルで文字列を削除しないようにします。

書かれているように、-Dオプションを忘れると、これはコンパイルされません。これは、要件に応じて良い場合と悪い場合があります。

9
Keith Thompson

ソースにアクセスできなくなった場合でも、次のオプションを使用してオブジェクトをリンクできます。

gcc -Wl,--defsym,VERSION_1_2_3=0 prog.o -o prog

hexdump -C prog | lessで確認し、VERSIONを探すことができます


これをmakefileに追加し、プログラムがいつコンパイルされたかを常に把握してください。

BUILD = $(Shell date +"%Y%m%d_%H%M%S")
LDLIBS = -Wl,--defsym,BUILD_$(BUILD)=0
6
Dr Beco

GNUリンカーldを使用すると

--version-script=version-scriptfile

コマンドラインオプションの詳細については、次を参照してください。 LDを使用して、GNUリンカー-オプション

バージョンスクリプトの作成の詳細については、次を参照してください。 LDを使用して、GNUリンカー-バージョンスクリプト

しかし、それは心の弱い人のためではないことを警告させてください!

1
mdk