2009-07-31 23 views
6

実行可能ファイルをメモリにロードする、共有ライブラリの動的ロードなど、main()を呼び出す前に起こっていることが不思議です。手渡し練習でこれらのことを理解する方法はありますか?プログラムをメモリにロードして実行する方法を理解するための実践的な練習

ツールAMDの事、私の知っている、と今使用して、含まれています

  • straceの
  • を逆アセンブル
  • readelfが
  • は/ proc/PID /マップ

NOTES:私は偉大な本linkers and loadersを知っていますが、実践的なエクササイズは本を読むよりも私によく教えてくれるかもしれません。

答えて

3
  • ld.so man page文書動的リンク・プロセスを微調整したり、追加の詳細を提供するのいずれかに設定することができるいくつかの環境変数。

LD_DEBUG=all cat </dev/null 
  • あなたは簡単にそれぞれのソースコードおよび関連するすべての部分を取得することができます - Linuxカーネル、ダイナミックリンカ、Cライブラリ、スタートアップコード(のcrt0.oまたは類似の)。あなたはコードを勉強し、実験的な修正を行うことから始めることができます。
3

バイナリがどのようにパックされているか、それのさまざまなセクションをチェックしたい場合は、そこから最高のプログラムがobjdumpだと思います。

何でも実行可能ファイルを選択して実行します。


objdump -S <executable> > myfile.S 

もう一つの良い運動は次のようになります。

  • 実行を静的リンク使用してプログラムをコンパイルし、外部ライブラリ
  • を使用するプログラムを作成します。プログラム
  • ライブラリファイルの名前を変更して、プログラムが実行されていることを確認します。
  • は、ライブラリの名前を変更し、プログラムはカーテンや方法の下で何が起こっているかについてご質問の一部にお答えします

を実行しているかどうかを確認、共有ライブラリを使用してプログラムをコンパイルします。

1

私は大学でOSクラスを取ったとき、Nachosを使用しました。それはオペレーティングシステムそれ自体ではなく、ユーザー空間で動作するオペレーティングシステム "シミュレーション"の一種です。です。これはC++で書かれており、Nachosがロードして実行できる実行可能ファイルをクロスコンパイルできます。あなたは、システムコールインターフェースでプレイすることができますし、一般的な実験では、コードをつぶすことで好きなだけ試すことができます。

私はSolarisラボで実行しましたが、私の個人的なマシンでLinuxで起動して実行するのには問題がありましたが、コードを掘り下げるのは楽しいおもちゃかもしれません。

1

あなたが探しているものは多分たくさんありますが、独自のアセンブラとリンカを書くことは非常に教育的だろうと思います。私は大学に通っていて、それを愛していました。私はそれが私がしたい基本的な事のために働くことを思い出して、それは多分120時間の仕事を要した。私はこのプロジェクトが何よりも、プログラムのキャリアが私のためであることを私に確信させてくれたと思う。

関連する問題