実行可能ファイルをメモリにロードする、共有ライブラリを動的にロードするなど、main()が呼び出される前に発生したことが気になります。実践的な演習でこれらのことを理解する方法について何か提案はありますか?
ツールと私が知っていること、そして今使っていることには、次のものが含まれます。
- strace
- 分解する
- readelf
- / proc / pid / map
注:私は優れた本のリンカーとローダーを知っていますが、実践的な演習は本を読むよりも私によく教えてくれるかもしれません。
バイナリがどのようにパックされているか、およびそのさまざまなセクションを確認したい場合は、objdumpが最適なプログラムだと思います。
実行可能ファイルを選択して実行します。
objdump -S <executable> > myfile.S
もう1つの良い演習は次のとおりです。
それは、カーテンの下で何が起こっているのか、そしてどのように起こっているのかについてのあなたの質問のいくつかに答えます。
例えば
LD_DEBUG=all cat </dev/null
関連する 2 つの興味深いリンク (少なくとも Linux の場合) と、前述の本よりも少し短いリンク (リンカーとローダー) を見つけました。
大学で OS の授業を受けたとき、私たちはNachosを使いました。それ自体はオペレーティング システムではなく、ユーザー空間で実行される一種のオペレーティング システムの「シミュレーション」です。これは C++ で書かれており、Nachos が読み込んで実行できる実行可能ファイルをクロスコンパイルできます。システム コール インターフェイスをいじったり、コードをいじって好きなだけ実験したりできます。
Solaris ラボで実行しましたが、個人のマシンの Linux で起動して実行するのに苦労しましたが、コードを掘り下げたいと思っているなら、楽しいおもちゃになるかもしれません。
あなたが探しているものはおそらくたくさんあると思いますが、独自のアセンブラーとリンカーを作成することは非常に教育的です. 大学時代にやっていて、大好きでした。思い出すと、やりたい基本的なことを機能させるのに、おそらく120時間の作業が必要でした. このプロジェクトは何よりも、プログラミングのキャリアが自分に向いていることを確信させてくれたと思います。