GccがソースコードバージョンのインフォアをセクションとしてELFバイナリに挿入できるかどうかを意味します。ソースファイルを変更したくないのですが、Makefileのgccオプションで情報を追加します。
バージョン情報をテキストファイルに出力し、そのテキストファイルをオブジェクトファイルに変換して、実行可能ファイルに静的にリンクすることができます。
最初のステップは簡単ですが、いくつかのコードを作成する必要があります。スクリプトなど、バージョン情報をプレーンテキストファイルとして任意の形式で書き込むためのものです。次に、 objcopy を使用して、version.txtからたとえばversion.oを生成するmakefileルールを記述します。これで、テキストバージョン情報の最初と最後の2つの便利な記号が定義されたオブジェクトファイルができました。生成されたオブジェクトを実行可能ファイルに追加すると、バイナリでstrings
を実行するか、アプリケーションでコードを記述してバージョン文字列を出力するという2つの方法でバージョンにアクセスできます(必要になります)。開始記号と終了記号をヘッダーファイルの変数として宣言します)。
ソースファイルを一度だけ変更してもかまわない場合は、次のようなものを追加します。
const volatile static char version[] = VERSION;
そしてコンパイル:
gcc -c -DVERSION='"1.2.3"'
volatile
は、gccがより高い最適化レベルで文字列を削除しないようにします。
書かれているように、-D
オプションを忘れると、これはコンパイルされません。これは、要件に応じて良い場合と悪い場合があります。
ソースにアクセスできなくなった場合でも、次のオプションを使用してオブジェクトをリンクできます。
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
GNUリンカーldを使用すると
--version-script=version-scriptfile
コマンドラインオプションの詳細については、次を参照してください。 LDを使用して、GNUリンカー-オプション
バージョンスクリプトの作成の詳細については、次を参照してください。 LDを使用して、GNUリンカー-バージョンスクリプト
しかし、それは心の弱い人のためではないことを警告させてください!