関数サイズに関する情報は、対応するシンボル(名前)のELF属性に格納されます。これをプログラムで解析する方法のCサンプルコードは、Solarisのマンページの下部にあります(libelfはLinux、* BSD、MacOSにも存在します。構造体のフィールドgelf_getsym(3ELF)
を探す必要があります)が、objdump/を使用することもできます。タスクのelfdump(Solaris)/ readelf(Linux):st_size
GElf_Sym
$ objdump -h -d --section = .text foo3.o
foo3.o:ファイル形式elf64-x86-64
セクション:
Idx名サイズVMALMAファイルオフAlgn
0 .text 00000012 0000000000000000 0000000000000000 00000040 2 ** 2
コンテンツ、ALLOC、ロード、読み取り専用、コード
[...]
セクション.textの逆アセンブル:
0000000000000000 <foo>:
0:55プッシュ%rbp
1:48 89 e5 mov%rsp、%rbp
4:89 7d fc mov%edi、0xfffffffffffffffc(%rbp)
7:89 75 f8 mov%esi、0xfffffffffffffff8(%rbp)
a:8b 45 f8 mov 0xfffffffffffffff8(%rbp)、%eax
d:03 45 fc add 0xfffffffffffffffc(%rbp)、%eax
10:c9 Leaveq
11:c3 retq
これは、コードの最適化されていないコンパイル用ですが、最適化されたバージョンは次のとおりです。
$ objdump -h -d --section = .text foo3.o
foo3.o:ファイル形式elf64-x86-64
セクション:
Idx名サイズVMALMAファイルオフAlgn
0 .text 00000004 0000000000000000 0000000000000000 00000040 2 ** 4
コンテンツ、ALLOC、ロード、読み取り専用、コード
[...]
セクション.textの逆アセンブル:
0000000000000000 <foo>:
0:8d 04 37 lea(%rdi、%rsi、1)、%eax
3:c3 retq
「サイズ」がから?に変更されていることに注意して0x12
ください4
。これが、.size
アセンブラディレクティブから得られるものです。
インラインアセンブリを使用して関数のサイズ/コードの場所を提供しようとする「トリック」は、コンパイラによって生成されたグルーコード(関数のエントリプロローグ/終了エピローグ、インラインコードの生成など)や、コンパイラの再生成を考慮していません。 -インラインアセンブリを注文する(gccはそうすることで悪名高い)ので、これを信頼することは一般的に良い考えではありません。結局、それはあなたが何をしようとしているのかによって異なります...
編集:スタックオーバーフローだけでなく外部のいくつかの参照:
- gccメーリングリストから、スレッドをオンにします
sizeof(function)
- sizeof(関数名)は何を返しますか?
- Cで関数のサイズを見つける
- sourceforgeプロジェクトの例によるLibELF(これはドキュメント/チュートリアルです)