2013-05-02 6 views

答えて

6

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

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

+4

ありがとうございます。 objcopy --add-section versection = version_text main main_versionというより良い方法があります。そして "objdump -s -j versection main_version"では、バージョンを取得することができます。 – Lane

+1

こんにちはジョン、私はあなたがこの回答が古い場合でも、あなたがアクティブなメンバーだと思う。テキストファイルをオブジェクトにコンパイルする方法のいくつかの非常に基本的な/簡単な例を使って更新してください。 「バージョン1.1.1」と言ってください。これは私が作ろうとしていた問題であり、それは(もっと/もっと)「重複した」ものになるでしょう... –

+1

@DrBeco:Linuxでは '--input binary'と' --output'の形式を明示的に指定して 'objcopy'を使うことができます。ここでは完全なチュートリアルがあります:http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967いくつかのオプションで 'ld'を使うこともできます。私は' -b'と同じことをやっていると思います。 –

6

は、このような何かを追加します。

const volatile static char version[] = VERSION; 

をして使用してコンパイル:

gcc -c -DVERSION='"1.2.3"' 

volatileが高い時に文字列を削除からのgccを保持します最適化レベル。

書かれているように、-Dオプションを忘れてしまった場合はコンパイルされません。このオプションは、要件によっては良いか悪いかがあります。あなたがでコマンドラインオプションの詳細を読む

--version-script=version-scriptfile 

を使用することができますGNUリンカldによる

4

あなたはもうあなたのソースへのアクセス権を持っていない場合でも、このオプションを使用してオブジェクトをリンクすることができますが:

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 
関連する問題