接下来是FindPhdr()函数。 const ElfW(Phdr) *phdr_limit = phdr_table_ + phdr_num_; // If there is a PT_PHDR, use it directly. // If there is a PT_PHDR, use it directly. for (const ElfW(Phdr) *phdr = phdr_table_; phdr < phdr_limi...
if (phdr->p_type == PT_LOAD) { if (phdr->p_offset == 0) { ElfW(Addr) elf_addr = load_bias_ + phdr->p_vaddr; const ElfW(Ehdr) *ehdr = reinterpret_cast<const ElfW(Ehdr) *>(elf_addr); ElfW(Addr) offset = ehdr->e_phoff; return CheckPhdr(reinterpret_cast<ElfW(A...
551行的soinfo::protect_relro()函数最终调用到$(bionic)/linker/linker_phdr.cpp文件777行的_phdr_table_set_gnu_relro_prot()函数会将PT_GNU_RELRO段指向的内存地址通过mprotoct函数设置为PROT_READ。该函数会对PT_GNU_RELRO段指向的内存起始和结束地址取页对齐,如果PT_GNU_RELRO段指向的内存段不是页对齐,...
该函数的作用是读取ELF的文件信息,代码的位置在bionic/linker/linker_phdr.cpp文件中 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 bool ElfReader::Read(const char *name, int fd, off64_t file_offset, off64_t file_size) { if (did_read_) { return true; } name_ = name; fd_ ...
Linker使用ElfRead类的load函数完成so文件的分析工作。该类的源代码在linker_phdr.cpp 中。Load函数代码如下: 代码语言:javascript 代码运行次数:0 复制Cloud Studio 代码运行 bool ElfReader::Load() { return ReadElfHeader() && VerifyElfHeader() && ReadProgramHeader() && ReserveAddressSpace() && LoadSegmen...
LoadTask对象的read方法十分简洁这里就不贴代码了。在/bionic/linker/linker_phdr.cpp目录中找到了ElfReader类中read函数的实现,这个函数很重要所以就全贴上了,可以看到,这里将我们打开so文件的fd以及file_size等一系列信息复制给了ElfReader对象然后做了5件事 ...
这里有一个关键函数phdr_table_get_load_siz:#!cpp/*返回ELF文件程序头部表中所指定的所有可加载segments(这些segments可能是非连续的)的区间大小,如果没有可加载的segments,就返回0如果out_min_vaddr 或 out_max_vadd是非空的,它们就会被设置成将被存储的页的最小/大地址(如果没有可加载segments的话,就设...
http://androidxref.com/4.4.4_r1/xref/bionic/linker/linker_phdr.cpp#1341 2 3 4 5 6 7 8 bool ElfReader::Load() { return ReadElfHeader() && VerifyElfHeader() && ReadProgramHeader() && ReserveAddressSpace() && LoadSegments() && FindPhdr(); }...
讀取so文件:讀取ehdr( Elf header )、phdr( Program header )等信息。 載入so:預留一片內存空間,隨後將相關信息加載進去,最後修正so。 預鏈接:主要處理.dynamic節的內容。 正式鏈接:處理重定位的信息。 調用.init、.init_array Read 利用open+mmap來將待加載的so文件映射到內存空間,存放在start_addr_中。然後...
LoadSegments、FindPhdr用於將待加載so的對應信息填充到此內存空間。 最後要修正so,將當前so修正為待加載的so,這部份放到後面來解析。 ReserveAddressSpace的具體實現如下,先計算出load_size_後mmap一片內存,在我這個demo中min_vaddr是0,因此load_start_ == load_bias_,load_bias_代表的就是這片內存,而這片...