私は、gccがソースコードのバージョン情報をELFバイナリにセクションまたは類似のものとして挿入できるかどうかを意味します。ソースファイルを変更するのではなく、Makefileにgccオプション付きの情報を追加したい。gccにはバージョン情報をELFバイナリファイルに追加するオプションはありますか?
答えて
バージョン情報をテキストファイルに出力し、そのテキストファイルをオブジェクトファイルに変換して、実行ファイルに静的にリンクすることができます。
最初の手順は簡単ですが、プレーンテキストファイルのような任意の形式でバージョン情報を書き込むためのスクリプトや何かを書く必要があります。それから、objcopyを使ってversion.txtからversion.oと言うようなmakefileルールを書いてください。これで、2つの有用なシンボルが定義されたオブジェクトファイルが作成されます:テキストバージョン情報の最初と最後。生成されたオブジェクトを実行可能ファイルに追加すると、バージョンに2つの方法でアクセスできます。strings
をバイナリで実行するか、アプリケーションにコードを書いてバージョン文字列を出力します(開始と終了を宣言する必要があります)いくつかのヘッダーファイルの中で変数として終了記号を使用します)。あなたは一度だけあなたのソースファイルを変更してもかまわない場合
は、このような何かを追加します。
const volatile static char version[] = VERSION;
をして使用してコンパイル:
gcc -c -DVERSION='"1.2.3"'
volatile
が高い時に文字列を削除からのgccを保持します最適化レベル。
書かれているように、-D
オプションを忘れてしまった場合はコンパイルされません。このオプションは、要件によっては良いか悪いかがあります。あなたがでコマンドラインオプションの詳細を読む
--version-script=version-scriptfile
を使用することができますGNUリンカldによる
: Using LD, the GNU linker - Version Script
てみましょう: Using LD, the GNU linker - Options
はでバージョンスクリプトの作成についての詳細を読みます私は弱い心のためではないことをあなたに警告します!
バージョンスクリプトは、単にコンパイラの設定を記録するのとは異なる目的を持っています。 – o11c
あなたはもうあなたのソースへのアクセス権を持っていない場合でも、このオプションを使用してオブジェクトをリンクすることができますが:
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
- 1. シンボルテーブルに共有ライブラリのバージョン情報を追加するには
- 2. iosバージョンの統計情報はどこにありますか?
- 3. GCCバージョンのバイナリファイル
- 4. gccはlinux ELFにどのような機能を追加しますか?
- 5. Xcode 3.2.5の「プロジェクト情報/ビルド」タブにGCC 4.2のオプションがありません
- 6. バージョン情報.EXE with gcc and windres
- 7. avrojsonに追加情報を追加できますか?
- 8. ELFファイルのバージョン・セクションに関する記述はありますか?
- 9. mac gccの-archオプションのドキュメントはどこにありますか?
- 10. System.Windows.Media.Media3D.Matrix3Dに関する情報はどこにありますか?
- 11. 情報バブルに動的情報を追加する
- 12. 設定情報ボタンをアプリ情報画面に追加する
- 13. ボタンに情報を追加する
- 14. データベースに情報を追加する
- 15. モバイルセンターでクラッシュに関する追加情報を追加するには
- 16. SQLiteに情報を追加
- 17. POSTペイロード情報はどこにありますかリクエストオブジェクトにありますか?
- 18. IntelliJを使ってjarファイル名にバージョン情報を追加
- 19. Selenium Gridリクエストに関する追加情報を渡す方法はありますか?
- 20. TFSスクリプトのバージョン情報でラベルを追加する方法
- 21. iOSアプリ「天気情報」の情報はどこにありますか?
- 22. サンドキャッスル/ SHFB。ヘルプファイルのページにプラットフォームのアイコンとバージョン情報を追加
- 23. ツールバーのボタンに情報を追加するには?
- 24. udpソケットに情報を追加するには?
- 25. VBAコードのaddinf情報をセルに追加するには
- 26. OS Xのアプリに「情報」アクションを追加するには?
- 27. Postgresqlのカルテインバリアント情報をタイムスタンプに追加するには?
- 28. Magento - 評価に評価情報を追加するには
- 29. JSONに型情報を追加するには?
- 30. 著作権情報をNibファイルに追加するには?
ありがとうございます。 objcopy --add-section versection = version_text main main_versionというより良い方法があります。そして "objdump -s -j versection main_version"では、バージョンを取得することができます。 – Lane
こんにちはジョン、私はあなたがこの回答が古い場合でも、あなたがアクティブなメンバーだと思う。テキストファイルをオブジェクトにコンパイルする方法のいくつかの非常に基本的な/簡単な例を使って更新してください。 「バージョン1.1.1」と言ってください。これは私が作ろうとしていた問題であり、それは(もっと/もっと)「重複した」ものになるでしょう... –
@DrBeco:Linuxでは '--input binary'と' --output'の形式を明示的に指定して 'objcopy'を使うことができます。ここでは完全なチュートリアルがあります:http://www.linuxjournal.com/content/embedding-file-executable-aka-hello-world-version-5967いくつかのオプションで 'ld'を使うこともできます。私は' -b'と同じことをやっていると思います。 –