ELF에서 두 부분의 오프셋이 동일한 이유는 무엇입니까?

ELF에서 두 부분의 오프셋이 동일한 이유는 무엇입니까?

최근에 저는 Linux에서 약간 의심스러운 ELF 파일 두 개를 발견했습니다. "/bin/ls" 파일을 예로 들어 readelf를 실행하면 다음을 볼 수 있습니다.

오프셋 0x213b8에서 시작하는 27개의 섹션 헤더가 있습니다.

Section Headers:
   [Nr] Name              Type            Address          Off    Size   ES Flg Lk   Inf Al
[ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
[ 1] .interp           PROGBITS        0000000000000318 000318 00001c 00   A  0   0  1
[ 2] .note.gnu.property NOTE            0000000000000338 000338 000050 00   A  0   0  8
[ 3] .note.gnu.build-id NOTE            0000000000000388 000388 000024 00   A  0   0  4
[ 4] .note.ABI-tag     NOTE            00000000000003ac 0003ac 000020 00   A  0   0  4
[ 5] .gnu.hash         GNU_HASH        00000000000003d0 0003d0 00005c 00   A  6   0  8
[ 6] .dynsym           DYNSYM          0000000000000430 000430 000bb8 18   A  7   1  8
[ 7] .dynstr           STRTAB          0000000000000fe8 000fe8 0005dd 00   A  0   0  1
[ 8] .gnu.version      VERSYM          00000000000015c6 0015c6 0000fa 02   A  6   0  2
[ 9] .gnu.version_r    VERNEED         00000000000016c0 0016c0 0000d0 00   A  7   1  8
[10] .rela.dyn         RELA            0000000000001790 001790 001ea8 18   A  6   0  8
[11] .init             PROGBITS        0000000000004000 004000 00001b 00  AX  0   0  4
[12] .text             PROGBITS        0000000000004020 004020 0133d3 00  AX  0   0 16
[13] .fini             PROGBITS        00000000000173f4 0173f4 00000d 00  AX  0   0  4
[14] .rodata           PROGBITS        0000000000018000 018000 00514f 00   A  0   0 32
[15] .eh_frame_hdr     PROGBITS        000000000001d150 01d150 0005bc 00   A  0   0  4
[16] .eh_frame         PROGBITS        000000000001d710 01d710 0021a0 00   A  0   0  8
[17] .init_array       INIT_ARRAY      0000000000020f70 01ff70 000008 08  WA  0   0  8
[18] .fini_array       FINI_ARRAY      0000000000020f78 01ff78 000008 08  WA  0   0  8
[19] .data.rel.ro      PROGBITS        0000000000020f80 01ff80 000af8 00  WA  0   0 32
[20] .dynamic          DYNAMIC         0000000000021a78 020a78 0001c0 10  WA  7   0  8
[21] .got              PROGBITS        0000000000021c38 020c38 0003b0 08  WA  0   0  8
[22] .data             PROGBITS        0000000000022000 021000 000278 00  WA  0   0 32
[23] .bss              NOBITS          0000000000022280 021278 001298 00  WA  0   0 32
[24] .comment          PROGBITS        0000000000000000 021278 00001b 01  MS  0   0  1
[25] .gnu_debuglink    PROGBITS        0000000000000000 021294 000010 00      0   0  4
[26] .shstrtab         STRTAB          0000000000000000 0212a4 00010f 00      0   0  1
Key to Flags:
 W (write), A (alloc), X (execute), M (merge), S (strings), I (info),
 L (link order), O (extra OS processing required), G (group), T (TLS),
 C (compressed), x (unknown), o (OS specific), E (exclude),
 D (mbind), l (large), p (processor specific)

섹션 헤더 [23]과 [24]의 오프셋을 살펴보면 이 두 섹션의 오프셋 값이 021278로 동일한 것을 알 수 있습니다. 이 두 섹션이 파일에서 동일한 오프셋을 공유할 수 있습니까? 나는 모른다. 여기에 문제가 있나요?

.bss 섹션과 같이 다른 ELF 파일에 동일한 오프셋을 공유하는 다른 섹션이 있다는 것을 알았습니다.

오프셋으로 인해 이러한 충돌이 발생하는 이유를 설명할 수 있는 사람이 있습니까?

답변1

파일의 두 섹션 중 첫 번째 섹션이 비어 있기 때문에 동일한 오프셋을 공유합니다. BSS는 런타임 시 공간을 예약하는 데 사용되지만 공간은 알려진 기본값(모두 0)으로 초기화되며 바이너리에 저장되지 않습니다.

섹션에는 주소 공간("주소" 열)과 파일("오프셋" 열)에 오프셋이 있습니다. 두 가지가 일치할 필요는 없습니다.

표시된 예에서 프로그램이 로드되면 0x1298 바이트가 프로그램의 주소 공간에 예약됩니다(이것이 "A" 플래그의 의미입니다).

관련 정보