1

gcc で単純なプログラムをコンパイルしましたが、objdump を使用してセクション ヘッダーが表示された場合、セクションが表示されません.symtab。同じa.outファイルに対して、 readelf は次のセクションを表示します。

[25] .symtab           SYMTAB          00000000 000ca4 000480 10     26  2c  4
[26] .strtab           STRTAB          00000000 001124 00025c 00      0   0  1

なんで?

.symtabデフォルトのリンカ スクリプトでは、セクションの定義が見つかりません。リンカー スクリプトのように自分で定義を追加すると、次のようになります。

....
PROVIDE(__start_sym)
.symtab : { *(.symtab)}
PROVIDE(__end_sym)
....

__start_symとのアドレスの差__end_symはゼロです。これは、そのようなセクションが出力ファイルに追加されないことを意味します。

しかし、readelf はセクションを読み取り、このセクションの内容をダンプすることができます.. どのように? なぜ ?

4

1 に答える 1

2

もちろん、symtabセクションは存在します。ツールは異なる方法で情報を提供するだけです。symtab は、この形式 (または同様の形式) で objdump (try -x)の動的セクションとしてリストされます。

...
  STRTAB 0x08048408
  SYMTAB 0x08048178
  STRSZ 0x0000016d
...

Objdump は、ファイルを「オブジェクト」としてより重視しているように見えますが (逆アセンブルも可能)、ELF 形式が提供できる情報、つまりファイルの「構造」自体について詳しく説明しています。

于 2010-06-08T13:20:29.857 に答える