Ignore:
Timestamp:
Oct 30, 2013, 3:00:14 AM (12 years ago)
Author:
bird
Message:

kLdrModMachO.c: Workaround for misaligned TEXT.unwind_info found once in VirtualBox.dylib (Xcode 3.2.6, I think). DYLIB debug info loading adjustments.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kLdr/kLdrModMachO.c

    r62 r63  
    739739                            case S_NON_LAZY_SYMBOL_POINTERS: \
    740740                            case S_LAZY_SYMBOL_POINTERS: \
     741                            case S_LAZY_DYLIB_SYMBOL_POINTERS: \
    741742                                /* (reserved 1 = is indirect symbol table index) */ \
    742743                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, KLDR_ERR_MACHO_BAD_SECTION); \
     
    759760                            \
    760761                            case S_LITERAL_POINTERS: \
     762                            case S_DTRACE_DOF: \
     763                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved1, KLDR_ERR_MACHO_BAD_SECTION); \
     764                                KLDRMODMACHO_CHECK_RETURN(!pSect->reserved2, KLDR_ERR_MACHO_BAD_SECTION); \
     765                                fFileBits = 1; \
     766                                break; \
     767                            \
    761768                            case S_INTERPOSING: \
    762769                            case S_GB_ZEROFILL: \
     
    780787                        KLDRMODMACHO_CHECK_RETURN(pSect->align < 31, \
    781788                                                  KLDR_ERR_MACHO_BAD_SECTION); \
     789                        /* Workaround for buggy ld64 (or as, llvm, ++) that produces a misaligned __TEXT.__unwind_info. */ \
     790                        /* Seen: pSect->align = 4, pSect->addr = 0x5ebe14.  Just adjust the alignment down. */ \
     791                        if (   ((K_BIT32(pSect->align) - KU32_C(1)) & pSect->addr) \
     792                            && pSect->align == 4 \
     793                            && kHlpStrComp(pSect->sectname, "__unwind_info") == 0) \
     794                            pSect->align = 2; \
    782795                        KLDRMODMACHO_CHECK_RETURN(!((K_BIT32(pSect->align) - KU32_C(1)) & pSect->addr), \
    783796                                                  KLDR_ERR_MACHO_BAD_SECTION); \
     
    10251038                if (!(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO))
    10261039                    KLDRMODMACHO_FAILED_RETURN(KLDR_ERR_MACHO_UNSUPPORTED_LOAD_COMMAND);
     1040                *pfCanLoad = K_FALSE;
    10271041                break;
    10281042
Note: See TracChangeset for help on using the changeset viewer.