Changeset 52


Ignore:
Timestamp:
Jul 9, 2013, 7:03:37 PM (12 years ago)
Author:
bird
Message:

Added KLDRMOD_OPEN_FLAGS_FOR_INFO and fixed more mach-o issues.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/k/kLdr.h

    r41 r52  
    589589/** @} */
    590590
     591/** @name Module Open Flags
     592 * @{ */
     593/** Indicates that we won't be loading the module, we're just getting
     594 *  information (like symbols and line numbers) out of it. */
     595#define KLDRMOD_OPEN_FLAGS_FOR_INFO     K_BIT32(0)
     596/** Mask of valid flags.    */
     597#define KLDRMOD_OPEN_FLAGS_VALID_MASK   KU32_C(0x00000001)
     598/** @} */
    591599
    592600int     kLdrModOpen(const char *pszFilename, KU32 fFlags, KCPUARCH enmCpuArch, PPKLDRMOD ppMod);
  • trunk/kLdr/kLdrMod.c

    r41 r52  
    301301    int         rc;
    302302
     303    kHlpAssertReturn(!(fFlags & ~KLDRMOD_OPEN_FLAGS_VALID_MASK), KERR_INVALID_PARAMETER);
     304
    303305    for (;;)
    304306    {
  • trunk/kLdr/kLdrModMachO.c

    r51 r52  
    126126    /** Pointer to the user mapping. */
    127127    void                   *pvMapping;
     128    /** The module open flags. */
     129    KU32                    fOpenFlags;
    128130
    129131    /** The offset of the image. (FAT fun.) */
     
    188190                                    PFNKLDRMODGETIMPORT pfnGetImport, void *pvUser);
    189191
    190 static int  kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, PKLDRMODMACHO *ppMod);
     192static int  kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, KU32 fOpenFlags, PKLDRMODMACHO *ppMod);
    191193static int  kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_header_32_t *pHdr, PKRDR pRdr, KLDRFOFF offImage,
    192                                              KU32 *pcSegments, KU32 *pcSections, KU32 *pcbStringPool, PKBOOL pfCanLoad,
    193                                              PKLDRADDR pLinkAddress);
     194                                             KU32 fOpenFlags, KU32 *pcSegments, KU32 *pcSections, KU32 *pcbStringPool,
     195                                             PKBOOL pfCanLoad, PKLDRADDR pLinkAddress);
    194196static int  kldrModMachOParseLoadCommands(PKLDRMODMACHO pModMachO, char *pbStringPool, KU32 cbStringPool);
    195197static int  kldrModMachOAdjustBaseAddress(PKLDRMODMACHO pModMachO, PKLDRADDR pBaseAddress);
     
    248250     * Create the instance data and do a minimal header validation.
    249251     */
    250     rc = kldrModMachODoCreate(pRdr, offNewHdr == -1 ? 0 : offNewHdr, &pModMachO);
     252    rc = kldrModMachODoCreate(pRdr, offNewHdr == -1 ? 0 : offNewHdr, fFlags, &pModMachO);
    251253    if (!rc)
    252254    {
     
    278280 * simplify cleanup on failure.
    279281 */
    280 static int kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, PKLDRMODMACHO *ppModMachO)
     282static int kldrModMachODoCreate(PKRDR pRdr, KLDRFOFF offImage, KU32 fOpenFlags, PKLDRMODMACHO *ppModMachO)
    281283{
    282284    union
     
    355357                  : sizeof(mach_header_64_t) + offImage);
    356358    if (!rc)
    357         rc = kldrModMachOPreParseLoadCommands(pbLoadCommands, &s.Hdr32, pRdr, offImage,
     359        rc = kldrModMachOPreParseLoadCommands(pbLoadCommands, &s.Hdr32, pRdr, offImage, fOpenFlags,
    358360                                              &cSegments, &cSections, &cbStringPool, &fCanLoad, &LinkAddress);
    359361    if (rc)
     
    456458    pModMachO->pvBits = NULL;
    457459    pModMachO->pvMapping = NULL;
     460    pModMachO->fOpenFlags = fOpenFlags;
    458461    pModMachO->Hdr = s.Hdr64;
    459462    if (    s.Hdr32.magic == IMAGE_MACHO32_SIGNATURE
     
    512515 */
    513516static int  kldrModMachOPreParseLoadCommands(KU8 *pbLoadCommands, const mach_header_32_t *pHdr, PKRDR pRdr, KLDRFOFF offImage,
    514                                              KU32 *pcSegments, KU32 *pcSections, KU32 *pcbStringPool, PKBOOL pfCanLoad,
    515                                              PKLDRADDR pLinkAddress)
     517                                             KU32 fOpenFlags, KU32 *pcSegments, KU32 *pcSections, KU32 *pcbStringPool,
     518                                             PKBOOL pfCanLoad, PKLDRADDR pLinkAddress)
    516519{
    517520    union
     
    526529    } u;
    527530    const KU64 cbFile = kRdrSize(pRdr) - offImage;
     531    const char *pchCurSegName = NULL;
    528532    KU32 cSegments = 0;
    529533    KU32 cSections = 0;
     
    667671                            break;
    668672
     673                        case S_MOD_INIT_FUNC_POINTERS: /** @todo this requires a query API or flag... (e.g. C++ constructors)  */
     674                            if (!(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO))
     675                                return KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION;
     676                        case S_MOD_TERM_FUNC_POINTERS: /** @todo this requires a query API or flag... (e.g. C++ destructors) */
     677                            if (!(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO))
     678                                return KLDR_ERR_MACHO_UNSUPPORTED_TERM_SECTION;
     679                            if (pSect->reserved1 || pSect->reserved2)
     680                                return KLDR_ERR_MACHO_BAD_SECTION;
     681                            fFileBits = 1;
     682                            break; /* ignored */
     683
    669684                        case S_LITERAL_POINTERS:
    670685                        case S_INTERPOSING:
    671686                        case S_GB_ZEROFILL:
    672                         case S_MOD_INIT_FUNC_POINTERS:
    673                             return KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION;
    674                         case S_MOD_TERM_FUNC_POINTERS:
    675                             return KLDR_ERR_MACHO_UNSUPPORTED_TERM_SECTION;
     687                            return KLDR_ERR_MACHO_UNSUPPORTED_SECTION;
    676688
    677689                        default:
     
    720732
    721733                            /* a new segment? */
    722                             if (    cSections == 1
    723                                 ||  kHlpStrNComp(pSect->segname, (pSect - 1)->segname, sizeof(pSect->segname)))
     734                            if (    !pchCurSegName
     735                                ||  kHlpStrNComp(pSect->segname, pchCurSegName, sizeof(pSect->segname)))
    724736                            {
    725737#if 0 /** @todo This doesn't work because of BSS. */
     
    735747
    736748                                /* ok. count it and the string. */
     749                                pchCurSegName = &pSect->segname[0];
     750                                cbStringPool += kHlpStrNLen(&pSect->segname[0], sizeof(pSect->segname)) + 1;
    737751                                cSegments++;
    738                                 cbStringPool += kHlpStrNLen(&pSect->segname[0], sizeof(pSect->segname)) + 1;
    739752
    740753                                /* Link address lower? */
     
    855868                            break;
    856869
     870                        case S_MOD_INIT_FUNC_POINTERS: /** @todo this requires a query API or flag... (e.g. C++ constructors)  */
     871                            if (!(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO))
     872                                return KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION;
     873                        case S_MOD_TERM_FUNC_POINTERS: /** @todo this requires a query API or flag... (e.g. C++ destructors) */
     874                            if (!(fOpenFlags & KLDRMOD_OPEN_FLAGS_FOR_INFO))
     875                                return KLDR_ERR_MACHO_UNSUPPORTED_TERM_SECTION;
     876                            if (pSect->reserved1 || pSect->reserved2)
     877                                return KLDR_ERR_MACHO_BAD_SECTION;
     878                            fFileBits = 1;
     879                            break; /* ignored */
     880
    857881                        case S_LITERAL_POINTERS:
    858882                        case S_INTERPOSING:
    859883                        case S_GB_ZEROFILL:
    860884                            return KLDR_ERR_MACHO_UNSUPPORTED_SECTION;
    861 #if 1 /** @todo this requires a query API or flag... */
    862                         case S_MOD_INIT_FUNC_POINTERS:
    863                             return KLDR_ERR_MACHO_UNSUPPORTED_INIT_SECTION;
    864                         case S_MOD_TERM_FUNC_POINTERS:
    865                             return KLDR_ERR_MACHO_UNSUPPORTED_TERM_SECTION;
    866 #else
    867                         case S_MOD_INIT_FUNC_POINTERS:
    868                         case S_MOD_TERM_FUNC_POINTERS:
    869                             fFileBits = 1;
    870                             break; /* ignored */
    871 #endif
    872885
    873886                        default:
     
    916929
    917930                            /* a new segment? */
    918                             if (    !cSections == 1
    919                                 ||  kHlpStrNComp(pSect->segname, (pSect - 1)->segname, sizeof(pSect->segname)))
     931                            if (    !pchCurSegName
     932                                ||  kHlpStrNComp(pSect->segname, pchCurSegName, sizeof(pSect->segname)))
    920933                            {
    921934#if 0 /** @todo This doesn't work because of BSS. */
     
    931944
    932945                                /* ok. count it and the string. */
     946                                pchCurSegName = &pSect->segname[0];
     947                                cbStringPool += kHlpStrNLen(&pSect->segname[0], sizeof(pSect->segname)) + 1;
    933948                                cSegments++;
    934                                 cbStringPool += kHlpStrNLen(&pSect->segname[0], sizeof(pSect->segname)) + 1;
    935949
    936950                                /* Link address lower? */
     
    11081122        const symtab_command_t     *pSymTab;
    11091123    } u;
     1124    const char *pchCurSegName = NULL;
    11101125    KU32 cLeft = pModMachO->Hdr.ncmds;
    11111126    KU32 cbLeft = pModMachO->Hdr.sizeofcmds;
    11121127    const KU8 *pb = pModMachO->pbLoadCommands;
    1113     int fFirstSegment = 1;
    11141128    PKLDRSEG pSeg = &pModMachO->pMod->aSegments[0];
    11151129    PKLDRMODMACHOSEG pSegExtra = &pModMachO->aSegments[0];
     
    11781192                            }
    11791193
    1180                             if (    fFirstSegment
    1181                                 ||  kHlpStrNComp(pSect->segname, (pSect - 1)->segname, sizeof(pSect->segname)))
     1194                            if (    !pchCurSegName
     1195                                ||  kHlpStrNComp(pSect->segname, pchCurSegName, sizeof(pSect->segname)))
    11821196                            {
    11831197                                /* close the previous segment */
     
    12131227                                pSeg->MapAddress = 0;
    12141228
     1229                                pSegExtra->iOrgSegNo = pSegExtra - &pModMachO->aSegments[0];
    12151230                                pSegExtra->cSections = 0;
    12161231                                pSegExtra->paSections = pSectExtra;
     
    12181233                                pSeg++;
    12191234                                pSegExtra++;
    1220                                 fFirstSegment = 0;
     1235                                pchCurSegName = &pSect->segname[0];
    12211236                            }
    12221237                            else
     
    13131328                            }
    13141329
    1315                             if (    fFirstSegment
    1316                                 ||  kHlpStrNComp(pSect->segname, (pSect - 1)->segname, sizeof(pSect->segname)))
     1330                            if (    !pchCurSegName
     1331                                ||  kHlpStrNComp(pSect->segname, pchCurSegName, sizeof(pSect->segname)))
    13171332                            {
    13181333                                /* close the previous segment */
     
    13541369                                pSeg++;
    13551370                                pSegExtra++;
    1356                                 fFirstSegment = 0;
     1371                                pchCurSegName = &pSect->segname[0];
    13571372                            }
    13581373                            else
Note: See TracChangeset for help on using the changeset viewer.