readelf 유틸리티가 함수 크기를 계산하는 방법을 이해하려고 합니다. 간단한 프로그램을 작성해봤습니다
#include <stdio.h>
int main() {
printf("Test!\n");
}
이제 내가 사용한 함수 크기를 확인하려면 다음을 수행하십시오(괜찮습니까?).
readelf -sw a.out|sort -n -k 3,3|grep FUNC
생산하다:
1: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@GLIBC_2.2.5 (2)
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.2.5 (2)
29: 0000000000400470 0 FUNC LOCAL DEFAULT 13 deregister_tm_clones
30: 00000000004004a0 0 FUNC LOCAL DEFAULT 13 register_tm_clones
31: 00000000004004e0 0 FUNC LOCAL DEFAULT 13 __do_global_dtors_aux
34: 0000000000400500 0 FUNC LOCAL DEFAULT 13 frame_dummy
48: 0000000000000000 0 FUNC GLOBAL DEFAULT UND puts@@GLIBC_2.2.5
50: 00000000004005b4 0 FUNC GLOBAL DEFAULT 14 _fini
51: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_
58: 0000000000400440 0 FUNC GLOBAL DEFAULT 13 _start
64: 00000000004003e0 0 FUNC GLOBAL DEFAULT 11 _init
45: 00000000004005b0 2 FUNC GLOBAL DEFAULT 13 __libc_csu_fini
60: 000000000040052d 16 FUNC GLOBAL DEFAULT 13 main
56: 0000000000400540 101 FUNC GLOBAL DEFAULT 13 __libc_csu_init
이제 메인 함수의 크기를 확인해보면 16이라고 나오네요. 이 값에 어떻게 도달합니까? 이것이 스택 크기입니까?
컴파일러는 gcc 버전 4.8.5(Ubuntu 4.8.5-2ubuntu1~14.04.1)를 사용합니다.
GNU readelf(Ubuntu용 GNU Binutils) 2.24
답변1
주어진 크기는 readelf
에 대한 바이너리 객체의 크기이며, main
이는 기능을 구현하는 기계 명령어의 순서입니다. 내 시스템에는
57: 00000000004004d7 21 FUNC GLOBAL DEFAULT 13 main
from 은 또는 에 표시된 readelf
것처럼 컴파일된 코드와 잘 일치합니다 .gcc -S
objdump -d
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: bf 00 00 00 00 mov $0x0,%edi
9: e8 00 00 00 00 callq e <main+0xe>
e: b8 00 00 00 00 mov $0x0,%eax
13: 5d pop %rbp
14: c3 retq
21바이트는 bytes 55
, 등 입니다 48
.89
e5