VirtualBox

Ignore:
Timestamp:
Jul 21, 2013 9:59:53 PM (12 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
87425
Message:

Fixes related to reading symbols from a 64-bit linux kernel (3.7).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Runtime/common/ldr/ldrELFRelocatable.cpp.h

    r46266 r47290  
    10961096     */
    10971097    char            szName[32];
     1098    Elf_Addr        uPrevMappedRva = 0;
    10981099    const Elf_Shdr *paShdrs    = pModElf->paShdrs;
    10991100    const Elf_Shdr *paOrgShdrs = pModElf->paOrgShdrs;
     
    11241125            const Elf_Shdr *pShdr2 = RTLDRELF_NAME(GetFirstAllocatedSection)(&paShdrs[iShdr + 1],
    11251126                                                                             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;
    11271134        }
    11281135        else
     
    17821789                 * Validate the section headers and find relevant sections.
    17831790                 */
     1791                Elf_Addr uNextAddr = 0;
    17841792                for (unsigned i = 0; i < pModElf->Ehdr.e_shnum; i++)
    17851793                {
     
    18221830                    }
    18231831
     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                    }
    18241845                } /* for each section header */
    18251846
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette