LOAD 세그먼트가 로드되지 않았습니다.

LOAD 세그먼트가 로드되지 않았습니다.

Android(8)에서 실행되는 aarch64 프로세스의 파일을 검사하는 동안 /proc/<PID>/maps다음 섹션을 발견했습니다.

726048e000-7260564000 r-xp 00000000 103:00 5402    /system/lib64/libc++.so
7260564000-7260565000 ---p 00000000 00:00 0
7260565000-726056d000 r--p 000d6000 103:00 5402    /system/lib64/libc++.so
726056d000-726056e000 rw-p 000de000 103:00 5402    /system/lib64/libc++.so
726056e000-7260571000 rw-p 00000000 00:00 0        [anon:.bss]
72605b3000-72605b5000 r-xp 00000000 103:00 5641    /system/lib64/libpackagelistparser.so

이것은 프로그램 헤더 테이블입니다 libc++.so.

Type           Offset   VirtAddr           PhysAddr           FileSiz  MemSiz   Flg Align
PHDR           0x000040 0x0000000000009040 0x0000000000009040 0x0001c0 0x0001c0 R   0x8
LOAD           0x000000 0x0000000000009000 0x0000000000009000 0x0d58fc 0x0d58fc R E 0x1000
LOAD           0x0d68e0 0x00000000000e08e0 0x00000000000e08e0 0x007770 0x00aea8 RW  0x1000
DYNAMIC        0x0dbb40 0x00000000000e5b40 0x00000000000e5b40 0x000220 0x000220 RW  0x8
NOTE           0x000200 0x0000000000009200 0x0000000000009200 0x000038 0x000038 R   0x4
GNU_EH_FRAME   0x0d3058 0x00000000000dc058 0x00000000000dc058 0x0028a4 0x0028a4 R   0x4
GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RW  0
GNU_RELRO      0x0d68e0 0x00000000000e08e0 0x00000000000e08e0 0x007720 0x007720 RW  0x10

0xe08e0두 번째 세그먼트의 주소를 취하고 LOAD베이스를 추가 0x726048e000하면 가 됩니다 0x726056e8e0. 그러나 위의 매핑 파일에서 볼 수 있듯이 매핑된 세그먼트가 없습니다.옳은그 주소에서. 대신 [anon:.bss]세그먼트와 겹칩니다. 0xaea8끝 주소가 크기가 이기 때문에 세그먼트에 완전히 포함되지도 않습니다 0x7260579788.

답변1

인쇄된 프로그램 헤더 테이블의 마지막 열은 정의된 세그먼트에 대한 정렬 요구 사항을 정의하는 헤더의 구성원 readelf입니다 . p_alignLinux 매뉴얼 페이지에서 elf(5):

이 멤버는 메모리와 파일에서 세그먼트 정렬을 유지합니다. 로드 가능한 프로세스 세그먼트의 p_vaddr 및 p_offset은 일관된 값(모듈로 페이지 크기)을 가져야 합니다. 값 0과 1은 정렬이 필요하지 않음을 나타냅니다. 그렇지 않으면 p_align은 2의 양의 정수 거듭제곱이어야 하며 p_vaddr은 p_align 모듈로 p_offset과 동일해야 합니다.

정렬 값으로 인해 초기화된 읽기 전용 데이터 세그먼트는 오프셋 ( 반올림) 및 크기 ( 반올림) 0x1000와 함께 메모리 맵에 포함됩니다. 이는 파일이 표시하는 것과 정확히 같습니다(네 번째 필드는 파일 오프셋입니다). 맵 길이는 끝 주소와 시작 주소를 빼서 계산할 수 있습니다 . 아래 두 맵은 동일한 정렬을 가지며, 보호 플래그를 통해 초기화된 데이터 세그먼트( ) 및 초기화되지 않은 데이터 세그먼트( ) 에 해당함을 추측할 수 있습니다 .0x0d60000x0d68e00x0080000x007770maps0x726056d000 - 0x7260565000 = 0x8000.data.bss

관련 정보