VirtualBox

Changeset 68 in kStuff for trunk


Ignore:
Timestamp:
Apr 29, 2015 11:59:02 AM (10 years ago)
Author:
bird
Message:

kLdrModMachO.c: Relocation fixes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrModMachO.c

    r67 r68  
    30813081                            break;
    30823082                        case X86_64_RELOC_SIGNED:
     3083                        case X86_64_RELOC_SIGNED_1:
     3084                        case X86_64_RELOC_SIGNED_2:
     3085                        case X86_64_RELOC_SIGNED_4:
    30833086                            SymAddr -= 4;
    3084                             break;
    3085                         case X86_64_RELOC_SIGNED_1:
    3086                             SymAddr -= 4 + 1;
    3087                             if (Fixup.r.r_extern)
    3088                                 SymAddr += 1;
    3089                             break;
    3090                         case X86_64_RELOC_SIGNED_2:
    3091                             SymAddr -= 4 + 2;
    3092                             if (Fixup.r.r_extern)
    3093                                 SymAddr += 2;
    3094                             break;
    3095                         case X86_64_RELOC_SIGNED_4:
    3096                             SymAddr -= 4 + 4;
    3097                             if (Fixup.r.r_extern)
    3098                                 SymAddr += 4;
    30993087                            break;
    31003088                        default:
     
    31773165                                              && Fixup2.r_type == X86_64_RELOC_UNSIGNED
    31783166                                              && !Fixup2.r_pcrel
    3179                                               && Fixup2.r_extern /*??*/
    31803167                                              && Fixup2.r_symbolnum < cSyms,
    31813168                                              KLDR_ERR_BAD_FIXUP);
    31823169
    3183                     pSym = &paSyms[Fixup.r.r_symbolnum];
    3184                     KLDRMODMACHO_CHECK_RETURN(!(pSym->n_type & MACHO_N_STAB), KLDR_ERR_BAD_FIXUP);
    3185 
    3186                     /* Add it's value to SymAddr. */
    3187                     switch (pSym->n_type & MACHO_N_TYPE)
     3170                    if (Fixup2.r_extern)
    31883171                    {
    3189                         case MACHO_N_SECT:
     3172                        KLDRMODMACHO_CHECK_RETURN(Fixup2.r_symbolnum < cSyms, KLDR_ERR_BAD_FIXUP);
     3173                        pSym = &paSyms[Fixup2.r_symbolnum];
     3174                        KLDRMODMACHO_CHECK_RETURN(!(pSym->n_type & MACHO_N_STAB), KLDR_ERR_BAD_FIXUP);
     3175
     3176                        /* Add it's value to SymAddr. */
     3177                        switch (pSym->n_type & MACHO_N_TYPE)
    31903178                        {
    3191                             PKLDRMODMACHOSECT pSymSect;
    3192                             KLDRMODMACHO_CHECK_RETURN((KU32)pSym->n_sect - 1 <= pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
    3193                             pSymSect = &pModMachO->paSections[pSym->n_sect - 1];
    3194                             SymAddr += pSym->n_value - pSymSect->LinkAddress + pSymSect->RVA + NewBaseAddress;
    3195                             break;
     3179                            case MACHO_N_SECT:
     3180                            {
     3181                                PKLDRMODMACHOSECT pSymSect;
     3182                                KLDRMODMACHO_CHECK_RETURN((KU32)pSym->n_sect - 1 <= pModMachO->cSections, KLDR_ERR_MACHO_BAD_SYMBOL);
     3183                                pSymSect = &pModMachO->paSections[pSym->n_sect - 1];
     3184                                SymAddr += pSym->n_value - pSymSect->LinkAddress + pSymSect->RVA + NewBaseAddress;
     3185                                break;
     3186                            }
     3187
     3188                            case MACHO_N_UNDF:
     3189                            case MACHO_N_ABS:
     3190                                SymAddr += pSym->n_value;
     3191                                break;
     3192
     3193                            case MACHO_N_INDR:
     3194                            case MACHO_N_PBUD:
     3195                                KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_TODO);
     3196                            default:
     3197                                KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_MACHO_BAD_SYMBOL);
    31963198                        }
    3197 
    3198                         case MACHO_N_UNDF:
    3199                         case MACHO_N_ABS:
    3200                             SymAddr += pSym->n_value;
    3201                             break;
    3202 
    3203                         case MACHO_N_INDR:
    3204                         case MACHO_N_PBUD:
    3205                             KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_TODO);
    3206                         default:
    3207                             KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_MACHO_BAD_SYMBOL);
    32083199                    }
     3200                    else if (Fixup2.r_symbolnum != R_ABS)
     3201                    {
     3202                        PKLDRMODMACHOSECT pSymSect;
     3203                        KLDRADDR TmpAddr;
     3204                        KLDRMODMACHO_CHECK_RETURN(Fixup2.r_symbolnum <= pModMachO->cSections, KLDR_ERR_BAD_FIXUP);
     3205                        pSymSect = &pModMachO->paSections[Fixup2.r_symbolnum - 1];
     3206                        SymAddr += pSymSect->RVA + NewBaseAddress;
     3207                    }
     3208                    else
     3209                        KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_BAD_FIXUP);
    32093210                }
    32103211                break;
     
    32133214        else
    32143215        {
    3215             /* verify against fixup type */
     3216            /* verify against fixup type and make adjustments */
    32163217            switch (Fixup.r.r_type)
    32173218            {
    32183219                case X86_64_RELOC_UNSIGNED:
     3220                    KLDRMODMACHO_CHECK_RETURN(!Fixup.r.r_pcrel, KLDR_ERR_BAD_FIXUP);
     3221                    break;
     3222                case X86_64_RELOC_BRANCH:
     3223                    KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel, KLDR_ERR_BAD_FIXUP);
     3224                    SymAddr += 4; /* dunno what the assmbler/linker really is doing here... */
     3225                    break;
    32193226                case X86_64_RELOC_SIGNED:
    3220                 case X86_64_RELOC_BRANCH:
    3221                 /*case X86_64_RELOC_GOT_LOAD:*/
    3222                 /*case X86_64_RELOC_GOT: */
    3223                 /*case X86_64_RELOC_SUBTRACTOR: - ???*/
    32243227                case X86_64_RELOC_SIGNED_1:
    32253228                case X86_64_RELOC_SIGNED_2:
    32263229                case X86_64_RELOC_SIGNED_4:
     3230                    KLDRMODMACHO_CHECK_RETURN(Fixup.r.r_pcrel, KLDR_ERR_BAD_FIXUP);
    32273231                    break;
     3232                /*case X86_64_RELOC_GOT_LOAD:*/
     3233                /*case X86_64_RELOC_GOT: */
     3234                /*case X86_64_RELOC_SUBTRACTOR: - must be r_extern=1 says as. */
    32283235                default:
    32293236                    KLDRMODMACHO_CHECK_RETURN(0, KLDR_ERR_BAD_FIXUP);
     
    32373244                SymAddr -= pSymSect->LinkAddress;
    32383245                SymAddr += pSymSect->RVA + NewBaseAddress;
     3246                if (Fixup.r.r_pcrel)
     3247                    SymAddr += Fixup.r.r_address;
    32393248            }
    32403249        }
Note: See TracChangeset for help on using the changeset viewer.

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