cat
Android(8)에서 실행되는 aarch64 프로세스()가 있습니다. 나는 이 부분을 주목했다 /proc/<PID/maps
:
746f308000-746f3de000 r-xp 00000000 103:00 5402 /system/lib64/libc++.so
746f3de000-746f3df000 ---p 00000000 00:00 0
746f3df000-746f3e7000 r--p 000d6000 103:00 5402 /system/lib64/libc++.so
746f3e7000-746f3e8000 rw-p 000d3000 103:00 5402 /system/lib64/libc++.so
746f3e8000-746f3eb000 rw-p 000de000 103:00 5402 [anon:.bss]
746f40e000- ... next file
이것은 프로그램 헤더 테이블입니다 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
섹션 제목은 다음과 같습니다 .got.plt
.
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
...
[22] .got.plt PROGBITS 00000000000e6310 0dc310 001ce8 00 WA 0 0 8
기본 주소를 추가한 후 0xe6310
섹션을 에 로드해야 합니다 0x746f3ee310
. 그러나 [anon:.bss]
다음 파일 사이에 해당됩니다.
답변1
이 매핑은 가상 주소를 정의하는 746f308000-746f3de000
첫 번째 세그먼트에 해당합니다 . 이를 염두에 두고 이 세그먼트와 첫 번째 세그먼트 간의 주소 차이를 먼저 계산하고 매핑된 기본 주소에 추가해야 합니다. 이는 결과 주소의 오프셋을 빼는 것과 같습니다. 이는 맵의 세 번째 주소입니다.LOAD
0x9000
.got.plt
0x9000
0x746f3ee310
0x746f3e5310