Changeset 47290 in vbox for trunk/src/VBox/Runtime/common/ldr
- Timestamp:
- Jul 21, 2013 9:59:53 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 87425
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h
r46266 r47290 1096 1096 */ 1097 1097 char szName[32]; 1098 Elf_Addr uPrevMappedRva = 0; 1098 1099 const Elf_Shdr *paShdrs = pModElf->paShdrs; 1099 1100 const Elf_Shdr *paOrgShdrs = pModElf->paOrgShdrs; … … 1124 1125 const Elf_Shdr *pShdr2 = RTLDRELF_NAME(GetFirstAllocatedSection)(&paShdrs[iShdr + 1], 1125 1126 pModElf->Ehdr.e_shnum - iShdr - 1); 1126 Seg.cbMapped = pShdr2 ? pShdr2->sh_addr - paShdrs[iShdr].sh_addr : paShdrs[iShdr].sh_size; 1127 if ( pShdr2 1128 && pShdr2->sh_addr >= paShdrs[iShdr].sh_addr 1129 && Seg.RVA >= uPrevMappedRva) 1130 Seg.cbMapped = pShdr2->sh_addr - paShdrs[iShdr].sh_addr; 1131 else 1132 Seg.cbMapped = RT_MAX(paShdrs[iShdr].sh_size, paShdrs[iShdr].sh_addralign); 1133 uPrevMappedRva = Seg.RVA; 1127 1134 } 1128 1135 else … … 1782 1789 * Validate the section headers and find relevant sections. 1783 1790 */ 1791 Elf_Addr uNextAddr = 0; 1784 1792 for (unsigned i = 0; i < pModElf->Ehdr.e_shnum; i++) 1785 1793 { … … 1822 1830 } 1823 1831 1832 /* Kluge for the .data..percpu segment in 64-bit linux kernels. */ 1833 if (paShdrs[i].sh_flags & SHF_ALLOC) 1834 { 1835 if ( paShdrs[i].sh_addr == 0 1836 && paShdrs[i].sh_addr < uNextAddr) 1837 { 1838 Elf_Addr uAddr = RT_ALIGN_T(uNextAddr, paShdrs[i].sh_addralign, Elf_Addr); 1839 Log(("RTLdrElf: Out of order section #%d; adjusting sh_addr from " FMT_ELF_ADDR " to " FMT_ELF_ADDR "\n", 1840 paShdrs[i].sh_addr, uAddr)); 1841 paShdrs[i].sh_addr = uAddr; 1842 } 1843 uNextAddr = paShdrs[i].sh_addr + paShdrs[i].sh_size; 1844 } 1824 1845 } /* for each section header */ 1825 1846
Note:
See TracChangeset
for help on using the changeset viewer.