2017-11-08 23 views
1

나는 .text와 .fini 데이터 세그먼트 사이에 빈 공간이 있습니까?

12 .text   00000172 0000000000400400 0000000000400400 00000400 2**4 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 
13 .fini   00000009 0000000000400574 0000000000400574 00000574 2**2 
        CONTENTS, ALLOC, LOAD, READONLY, CODE 

나는 여기에 빠른 질문이 간단한 C 프로그램 ( gcc -o file file.cpp)를 컴파일하고 objdump -h file을 실행에 다음과 같은 출력을 얻을.

.text 섹션 이후에 왜 2 바이트의 간격이 있습니까? 0x400400 + 0x172 = 0x400572, 그러나 .fini 구역은 0x400574에서 시작됩니까? 이것은 정렬과 관련이 있습니까? 나는 다른 섹션들 사이에서도 비슷한 틈을 발견했다.

+3

아마 정렬. 그런데 왜 묻지? 호기심? 아니면이 문제로 이어질 또 다른 문제가 있습니까? –

+0

가상 주소 공간 – martianwars

+0

에서'.text' 세그먼트의 범위를 식별하는 방법을 찾으려고 할 때 아마 링커 스크립트에서 다음과 같은 것을 발견하게 될 것입니다 :'. = 정렬 (4); –

답변

2

objdump -h file의 출력 마지막 열은 섹션의 맞춤입니다. .fini의 맞춤은 4 (2**2은 2의 2의 2)이므로 0x400572 대신 0x400574에서 시작하는 이유입니다.

x86-64에 대한 glibc에 대한 링크와 상기 .fini4 섹션의 배향은 crti.o에 규정되어

.section .fini,"ax",@progbits 
    .p2align 2 
    .globl _fini 
    .type _fini, @function 
_fini: