Changeset 2896 for trunk/src


Ignore:
Timestamp:
Sep 8, 2016, 5:32:09 PM (9 years ago)
Author:
bird
Message:

kDepObj: Added support for -bigobj output.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/kmkbuiltin/kDepObj.c

    r2894 r2896  
    752752int kDepObjCOFFParse(const KU8 *pbFile, KSIZE cbFile)
    753753{
    754     IMAGE_FILE_HEADER const    *pFileHdr = (IMAGE_FILE_HEADER const *)pbFile;
    755     IMAGE_SECTION_HEADER const *paSHdrs  = (IMAGE_SECTION_HEADER const *)((KU8 const *)(pFileHdr + 1) + pFileHdr->SizeOfOptionalHeader);
    756     unsigned                    cSHdrs   = pFileHdr->NumberOfSections;
    757     unsigned                    iSHdr;
    758     KPCUINT                     u;
    759     int                         rcRet    = 2;
    760     int                         rc;
     754    IMAGE_FILE_HEADER const            *pFileHdr   = (IMAGE_FILE_HEADER const *)pbFile;
     755    ANON_OBJECT_HEADER_BIGOBJ const    *pBigObjHdr = (ANON_OBJECT_HEADER_BIGOBJ const *)pbFile;
     756    IMAGE_SECTION_HEADER const         *paSHdrs;
     757    KU32                                cSHdrs;
     758    unsigned                            iSHdr;
     759    KPCUINT                             u;
     760    int                                 rcRet      = 2;
     761    int                                 rc;
     762
     763    if (   pBigObjHdr->Sig1 == 0
     764        && pBigObjHdr->Sig2 == KU16_MAX)
     765    {
     766        paSHdrs = (IMAGE_SECTION_HEADER const *)(pBigObjHdr + 1);
     767        cSHdrs  = pBigObjHdr->NumberOfSections;
     768    }
     769    else
     770    {
     771        paSHdrs = (IMAGE_SECTION_HEADER const *)((KU8 const *)(pFileHdr + 1) + pFileHdr->SizeOfOptionalHeader);
     772        cSHdrs  = pFileHdr->NumberOfSections;
     773    }
     774
    761775
    762776    dprintf(("COFF file!\n"));
     
    795809KBOOL kDepObjCOFFTest(const KU8 *pbFile, KSIZE cbFile)
    796810{
    797     IMAGE_FILE_HEADER const    *pFileHdr = (IMAGE_FILE_HEADER const *)pbFile;
    798     IMAGE_SECTION_HEADER const *paSHdrs  = (IMAGE_SECTION_HEADER const *)((KU8 const *)(pFileHdr + 1) + pFileHdr->SizeOfOptionalHeader);
    799     unsigned                    cSHdrs   = pFileHdr->NumberOfSections;
    800     unsigned                    iSHdr;
    801     KSIZE                       cbHdrs   = (const KU8 *)&paSHdrs[cSHdrs] - (const KU8 *)pbFile;
     811    IMAGE_FILE_HEADER const         *pFileHdr   = (IMAGE_FILE_HEADER const *)pbFile;
     812    ANON_OBJECT_HEADER_BIGOBJ const *pBigObjHdr = (ANON_OBJECT_HEADER_BIGOBJ const *)pbFile;
     813    IMAGE_SECTION_HEADER const      *paSHdrs;
     814    KU32                             cSHdrs;
     815    KU32                             iSHdr;
     816    KSIZE                            cbHdrs;
    802817
    803818    if (cbFile <= sizeof(*pFileHdr))
    804819        return K_FALSE;
    805     if (    pFileHdr->Machine != IMAGE_FILE_MACHINE_I386
    806         &&  pFileHdr->Machine != IMAGE_FILE_MACHINE_AMD64)
     820
     821    /*
     822     * Deal with -bigobj output first.
     823     */
     824    if (   pBigObjHdr->Sig1 == 0
     825        && pBigObjHdr->Sig2 == KU16_MAX)
     826    {
     827        static const KU8 s_abClsId[16] = { ANON_OBJECT_HEADER_BIGOBJ_CLS_ID_BYTES };
     828
     829        paSHdrs = (IMAGE_SECTION_HEADER const *)(pBigObjHdr + 1);
     830        cSHdrs  = pBigObjHdr->NumberOfSections;
     831        cbHdrs  = sizeof(IMAGE_SECTION_HEADER) * cSHdrs;
     832
     833        if (cbFile <= sizeof(*pBigObjHdr))
     834            return K_FALSE;
     835
     836        if (pBigObjHdr->Version != 2)
     837            return K_FALSE;
     838        if (memcmp(&pBigObjHdr->ClassID[0], s_abClsId, sizeof(pBigObjHdr->ClassID)) != 0)
     839            return K_FALSE;
     840
     841        if (   pBigObjHdr->Machine != IMAGE_FILE_MACHINE_I386
     842            && pBigObjHdr->Machine != IMAGE_FILE_MACHINE_AMD64
     843            && pBigObjHdr->Machine != IMAGE_FILE_MACHINE_ARM
     844            && pBigObjHdr->Machine != IMAGE_FILE_MACHINE_ARMNT
     845            && pBigObjHdr->Machine != IMAGE_FILE_MACHINE_ARM64
     846            && pBigObjHdr->Machine != IMAGE_FILE_MACHINE_EBC)
     847        {
     848            fprintf(stderr, "kDepObj: error: bigobj Machine not supported: %#x\n", pBigObjHdr->Machine);
     849            return K_FALSE;
     850        }
     851        if (pBigObjHdr->Flags != 0)
     852        {
     853            fprintf(stderr, "kDepObj: error: bigobj Flags field is non-zero: %#x\n", pBigObjHdr->Flags);
     854            return K_FALSE;
     855        }
     856        if (pBigObjHdr->SizeOfData != 0)
     857        {
     858            fprintf(stderr, "kDepObj: error: bigobj SizeOfData field is non-zero: %#x\n", pBigObjHdr->SizeOfData);
     859            return K_FALSE;
     860        }
     861
     862        if (   pBigObjHdr->PointerToSymbolTable != 0
     863            && (   pBigObjHdr->PointerToSymbolTable < cbHdrs
     864                || pBigObjHdr->PointerToSymbolTable > cbFile))
     865            return K_FALSE;
     866        if (   pBigObjHdr->PointerToSymbolTable == 0
     867            && pBigObjHdr->NumberOfSymbols != 0)
     868            return K_FALSE;
     869    }
     870    /*
     871     * Look for normal COFF object.
     872     */
     873    else
     874    {
     875        paSHdrs = (IMAGE_SECTION_HEADER const *)((KU8 const *)(pFileHdr + 1) + pFileHdr->SizeOfOptionalHeader);
     876        cSHdrs  = pFileHdr->NumberOfSections;
     877        cbHdrs  = (const KU8 *)&paSHdrs[cSHdrs] - (const KU8 *)pbFile;
     878
     879        if (   pFileHdr->Machine != IMAGE_FILE_MACHINE_I386
     880            && pFileHdr->Machine != IMAGE_FILE_MACHINE_AMD64
     881            && pFileHdr->Machine != IMAGE_FILE_MACHINE_ARM
     882            && pFileHdr->Machine != IMAGE_FILE_MACHINE_ARMNT
     883            && pFileHdr->Machine != IMAGE_FILE_MACHINE_ARM64
     884            && pFileHdr->Machine != IMAGE_FILE_MACHINE_EBC)
     885               return K_FALSE;
     886
     887        if (pFileHdr->SizeOfOptionalHeader != 0)
     888            return K_FALSE; /* COFF files doesn't have an optional header */
     889
     890        if (   pFileHdr->PointerToSymbolTable != 0
     891            && (   pFileHdr->PointerToSymbolTable < cbHdrs
     892                || pFileHdr->PointerToSymbolTable > cbFile))
     893            return K_FALSE;
     894        if (   pFileHdr->PointerToSymbolTable == 0
     895            && pFileHdr->NumberOfSymbols != 0)
     896            return K_FALSE;
     897        if (  pFileHdr->Characteristics
     898            & (  IMAGE_FILE_DLL
     899               | IMAGE_FILE_SYSTEM
     900               | IMAGE_FILE_UP_SYSTEM_ONLY
     901               | IMAGE_FILE_NET_RUN_FROM_SWAP
     902               | IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
     903               | IMAGE_FILE_EXECUTABLE_IMAGE
     904               | IMAGE_FILE_RELOCS_STRIPPED))
     905            return K_FALSE;
     906    }
     907    if (   cSHdrs <= 1
     908        || cSHdrs > cbFile)
    807909        return K_FALSE;
    808     if (pFileHdr->SizeOfOptionalHeader != 0)
    809         return K_FALSE; /* COFF files doesn't have an optional header */
    810 
    811     if (    pFileHdr->NumberOfSections <= 1
    812         ||  pFileHdr->NumberOfSections > cbFile)
    813         return K_FALSE;
    814 
    815910    if (cbHdrs >= cbFile)
    816911        return K_FALSE;
    817912
    818     if (    pFileHdr->PointerToSymbolTable != 0
    819         &&  (   pFileHdr->PointerToSymbolTable < cbHdrs
    820              || pFileHdr->PointerToSymbolTable > cbFile))
    821         return K_FALSE;
    822     if (    pFileHdr->PointerToSymbolTable == 0
    823         &&  pFileHdr->NumberOfSymbols != 0)
    824         return K_FALSE;
    825     if (    pFileHdr->Characteristics
    826         &   (  IMAGE_FILE_DLL
    827              | IMAGE_FILE_SYSTEM
    828              | IMAGE_FILE_UP_SYSTEM_ONLY
    829              | IMAGE_FILE_NET_RUN_FROM_SWAP
    830              | IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
    831              | IMAGE_FILE_EXECUTABLE_IMAGE
    832              | IMAGE_FILE_RELOCS_STRIPPED))
    833         return K_FALSE;
    834 
     913    /*
     914     * Check the section headers.
     915     */
    835916    for (iSHdr = 0; iSHdr < cSHdrs; iSHdr++)
    836917    {
    837         if (    paSHdrs[iSHdr].PointerToRawData != 0
    838             &&  (   paSHdrs[iSHdr].PointerToRawData < cbHdrs
    839                  || paSHdrs[iSHdr].PointerToRawData >= cbFile
    840                  || paSHdrs[iSHdr].PointerToRawData + paSHdrs[iSHdr].SizeOfRawData > cbFile))
    841             return K_FALSE;
    842         if (    paSHdrs[iSHdr].PointerToRelocations != 0
    843             &&  (   paSHdrs[iSHdr].PointerToRelocations < cbHdrs
    844                  || paSHdrs[iSHdr].PointerToRelocations >= cbFile
    845                  || paSHdrs[iSHdr].PointerToRelocations + paSHdrs[iSHdr].NumberOfRelocations * 10 > cbFile)) /* IMAGE_RELOCATION */
    846             return K_FALSE;
    847         if (    paSHdrs[iSHdr].PointerToLinenumbers != 0
    848             &&  (   paSHdrs[iSHdr].PointerToLinenumbers < cbHdrs
    849                  || paSHdrs[iSHdr].PointerToLinenumbers >= cbFile
    850                  || paSHdrs[iSHdr].PointerToLinenumbers + paSHdrs[iSHdr].NumberOfLinenumbers *  6 > cbFile)) /* IMAGE_LINENUMBER */
     918        if (   paSHdrs[iSHdr].PointerToRawData != 0
     919            && (   paSHdrs[iSHdr].PointerToRawData < cbHdrs
     920                || paSHdrs[iSHdr].PointerToRawData >= cbFile
     921                || paSHdrs[iSHdr].PointerToRawData + paSHdrs[iSHdr].SizeOfRawData > cbFile))
     922            return K_FALSE;
     923        if (   paSHdrs[iSHdr].PointerToRelocations != 0
     924            && (   paSHdrs[iSHdr].PointerToRelocations < cbHdrs
     925                || paSHdrs[iSHdr].PointerToRelocations >= cbFile
     926                || paSHdrs[iSHdr].PointerToRelocations + paSHdrs[iSHdr].NumberOfRelocations * 10 > cbFile)) /* IMAGE_RELOCATION */
     927            return K_FALSE;
     928        if (   paSHdrs[iSHdr].PointerToLinenumbers != 0
     929            && (   paSHdrs[iSHdr].PointerToLinenumbers < cbHdrs
     930                || paSHdrs[iSHdr].PointerToLinenumbers >= cbFile
     931                || paSHdrs[iSHdr].PointerToLinenumbers + paSHdrs[iSHdr].NumberOfLinenumbers *  6 > cbFile)) /* IMAGE_LINENUMBER */
    851932            return K_FALSE;
    852933    }
     
    882963    else
    883964    {
    884         fprintf(stderr, "%s: error: Doesn't recognize the header of the OMF file.\n", argv0);
     965        fprintf(stderr, "%s: error: Doesn't recognize the header of the OMF/COFF file.\n", argv0);
    885966        rc = 1;
    886967    }
Note: See TracChangeset for help on using the changeset viewer.