1

Hello World C ファイルをコンパイルしましたが、必要なセクションは 1 つだけです (hello world 関数のみ)。

コンパイルされたファイルの形式は elf32-i386 で、次の 4 つのセクションが含まれ.rodata.text.hello.commentます.eh_frame

objcopy を使用して.text.helloセクションのみを抽出しようとしました: http://www.thegeekstuff.com/2013/01/objcopy-examples/ example 3.

失敗し、次のように報告します。

BFD: hello_new: symbol `.rodata' required but not present
objcopy:hello_new: No symbols

それを解決する方法は?

4

1 に答える 1

2

.text最初に、ランタイム実行の目的で、セクションのみが必要であると述べましたか? それは正しくありません: hello 関数の内部にハードコーディングされた文字列がある場合、これらの文字列はすべて.rodataセクション内に配置されるため、このセクションを無視しますか?

.eh_frameデバッガー用であり、.comment必要ではないと思いますが、必要で.dataもあります。

もう1つのことは再配置テーブルです-関数が任意のメモリ領域に動的にロードされる場合、関数内の多くの領域にパッチを適用する必要がある場合があります.ELFをチェックobjdump -rして、再配置があるかどうかを確認しますエントリ。そうでなければ、あなたは安全です。

また、「const」として宣言された関数内のすべてのものも.rodataセクションに入ります-もちろんグローバルデータです。関数にローカルな変数または定数はスタックにあります。また、すべてのグローバル データはセクション内にあり.dataます。

しかし、元のエラーに戻ると、元の URL の例 3 には相互参照 (.interpセクション)objdump -sがないため、エラーにはならないからです。あなたのケースに.textは、セクションへの相互参照.rodataがありますが、セクションだけを抽出した後は利用できません.text

于 2014-08-09T07:57:07.927 に答える