bool
LoadSegments() {
for
(size_t i
=
0
; i < phdr_num_;
+
+
i) {
const ElfW(Phdr)
*
phdr
=
&phdr_table_[i];
if
(phdr
-
>p_type !
=
PT_LOAD) {
continue
;
}
/
/
Segment addresses
in
memory.
ElfW(Addr) seg_start
=
phdr
-
>p_vaddr
+
load_bias_;
ElfW(Addr) seg_end
=
seg_start
+
phdr
-
>p_memsz;
ElfW(Addr) seg_page_start
=
PAGE_START(seg_start);
ElfW(Addr) seg_page_end
=
PAGE_END(seg_end);
ElfW(Addr) seg_file_end
=
seg_start
+
phdr
-
>p_filesz;
/
/
File
offsets.
ElfW(Addr) file_start
=
phdr
-
>p_offset;
ElfW(Addr) file_end
=
file_start
+
phdr
-
>p_filesz;
ElfW(Addr) file_page_start
=
PAGE_START(file_start);
ElfW(Addr) file_length
=
file_end
-
file_page_start;
long
*
pp
=
reinterpret_cast<
long
*
>(seg_page_start);
__android_log_print(
6
,
"r0ysue"
,
"%p 111111"
,load_bias_);
__android_log_print(
6
,
"r0ysue"
,
"%p 111111"
,seg_page_end);
mprotect(reinterpret_cast<void
*
>(seg_page_start), seg_page_end
-
seg_page_start, PROT_WRITE);
/
/
申请访问权限
if
(file_length !
=
0
) {
void
*
c
=
(char
*
)st
+
file_page_start;
memcpy(reinterpret_cast<void
*
>(seg_page_start), c, file_length);
/
/
我把mmap改成了memcpy因为安卓源码中用了fd我期望全使用内存加载的方式所以有fd的地方我都改了
}
if
((phdr
-
>p_flags & PF_W) !
=
0
&& PAGE_OFFSET(seg_file_end) >
0
) {
memset(reinterpret_cast<void
*
>(seg_file_end),
0
, PAGE_SIZE
-
PAGE_OFFSET(seg_file_end));
}
seg_file_end
=
PAGE_END(seg_file_end);
if
(seg_page_end > seg_file_end) {
void
*
zeromap
=
mmap(reinterpret_cast<void
*
>(seg_file_end),
seg_page_end
-
seg_file_end,
PFLAGS_TO_PROT(phdr
-
>p_flags),
MAP_FIXED|MAP_ANONYMOUS|MAP_PRIVATE,
-
1
,
0
);
__android_log_print(
6
,
"r0ysue"
,
"duiqi %p "
,zeromap);
}
/
/
__android_log_print(
6
,
"r0ysue"
,
"%p 111111"
,seg_file_end);
}
return
true;
};