바이너리의 다양한 구성 요소의 코드 크기를 추정하려고 합니다. 소스 코드와 모든 빌드 개체 파일이 포함된 빌드 디렉터리에 액세스할 수 있습니다. 물론 실제로 사용되는 심볼만 포함하고 싶기 때문에 모든 개체 파일 .text
과 .data
섹션의 크기를 추가하면 실제 값이 과대평가되게 됩니다.
ELF 파일을 연결하는 데 사용되는 모든 기호의 크기와 출처를 확인하는 방법은 무엇입니까? 다음과 같은 것이 유용할 것입니다:
Symbol Size Origin
func1 0x50 ../src/func1.o
func2 0x75 ../src/func2.o
...
이는 모든 기호에 대해 유사합니다 .data
. 생성된 .map
파일에는 다음이 있는 것 같습니다.일부그러나 이러한 데이터는 불완전한 것으로 보입니다. 눈에 띄는 두 부분은 다음과 같습니다.
Allocating common symbols
Common symbol size file
s_Handle 0x8 ../BUILD/src/handle.o
_main_obj 0x48 ../BUILD/src/boot.o
....
그러나 여기에는 수십 개의 기호만 나열되어 있습니다. 다음 섹션에는 더 많은 기호가 있는 것으로 보이지만 링크할 때 "더 이상 사용되지 않음"으로 표시됩니다.
Discarded input sections
.text 0x00000000 0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7e-m/crti.o
.data 0x00000000 0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7e-m/crti.o
.bss 0x00000000 0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/armv7e-m/crti.o
.data 0x00000000 0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/crt0.o
.bss 0x00000000 0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/crt0.o
.ARM.extab 0x00000000 0x0 /home/user/.programs/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/crt0.o
.text._Z12notify_startv
0x00000000 0x14 ../BUILD/./test_env.o
.text._Z30notify_performance_coefficientPKci
0x00000000 0x18 ../BUILD/./test_env.o
.text._Z30notify_performance_coefficientPKcj
0x00000000 0x18 ../BUILD/./test_env.o
.text._Z30notify_performance_coefficientPKcd
0x00000000 0x20 ../BUILD/./test_env.o
.text._Z17notify_completionb
0x00000000 0x64 ../BUILD/./test_env.o
.text._Z21notify_completion_strbPc
0x00000000 0x30 ../BUILD/./test_env.o
...
답변1
당신은 사용하고 싶을 수도 있습니다부풀어 오른 맥브로트 얼굴:
"VM SIZE" 열은 바이너리가 메모리에 로드될 때 차지하는 공간을 알려줍니다. 파일 크기 열은 바이너리가 디스크에서 차지하는 공간을 알려줍니다. [...]기본값무너지다브로디에는섹션별, 그러나 다음과 같이 바이너리 파일을 분할하는 다른 많은 방법을 지원합니다.상징그리고시장 부문. 디버그 정보로 컴파일하면 충돌이 발생할 수도 있습니다.컴파일 유닛과 인라인을 통해!
답변2
언급할 수는 없습니다. 참고만 하세요. 이 Allocating common symbols
섹션에는 프로그램의 전역 변수 이름과 크기가 나열되어 있습니다.