VirtualBox

忽略:
時間撮記:
2016-3-2 下午04:38:37 (9 年 以前)
作者:
vboxsync
訊息:

bs3kit: build fix

檔案:
修改 1 筆資料

圖例:

未更動
新增
刪除
  • trunk/src/VBox/ValidationKit/bootsectors/bs3kit/VBoxBs3ObjConverter.cpp

    r59534 r59900  
    3535#include <iprt/types.h>
    3636#include <iprt/assert.h>
     37#include <iprt/x86.h>
    3738
    3839#include <iprt/formats/elf64.h>
     
    319320};
    320321
     322
     323static const char *coffGetSymbolName(PCIMAGE_SYMBOL pSym, const char *pchStrTab, char pszShortName[16])
     324{
     325    if (pSym->N.Name.Short != 0)
     326    {
     327        memcpy(pszShortName, pSym->N.ShortName, 8);
     328        pszShortName[8] = '\0';
     329        return pszShortName;
     330    }
     331    return pchStrTab + pSym->N.Name.Long;
     332}
     333
    321334static bool convertcoff(const char *pszFile, uint8_t *pbFile, size_t cbFile)
    322335{
     
    342355    }
    343356
     357    /* Dump the symbol table if verbose mode. */
     358    PIMAGE_SYMBOL paSymTab  = (PIMAGE_SYMBOL)&pbFile[pHdr->PointerToSymbolTable];
     359    const char   *pchStrTab = (const char *)&paSymTab[pHdr->NumberOfSymbols];
     360    char          szShortName[16];
     361    if (g_cVerbose > 2)
     362        for (uint32_t i = 0; i < pHdr->NumberOfSymbols; i++)
     363        {
     364            printf("sym[0x%02x]: sect=0x%04x value=0x%08x storageclass=0x%x name=%s\n",
     365                   i, paSymTab[i].SectionNumber, paSymTab[i].Value, paSymTab[i].StorageClass,
     366                   coffGetSymbolName(&paSymTab[i], pchStrTab, szShortName));
     367            i += paSymTab[i].NumberOfAuxSymbols;
     368        }
     369
    344370    /* Switch it to a x86 machine. */
    345371    pHdr->Machine = IMAGE_FILE_MACHINE_I386;
     
    349375     */
    350376    bool fRet = true;
    351     PCIMAGE_SECTION_HEADER paShdrs   = (PCIMAGE_SECTION_HEADER)(pHdr + 1);
     377    PIMAGE_SECTION_HEADER paShdrs = (PIMAGE_SECTION_HEADER)(pHdr + 1);
    352378    for (uint32_t i = 0; i < pHdr->NumberOfSections; i++)
    353379    {
     
    361387                   paShdrs[i].PointerToRelocations, paShdrs[i].NumberOfRelocations,
    362388                   paShdrs[i].PointerToLinenumbers, paShdrs[i].NumberOfLinenumbers, paShdrs[i].Characteristics);
    363         uint32_t const cRelocs = paShdrs[i].NumberOfRelocations;
     389        uint32_t cRelocs = paShdrs[i].NumberOfRelocations;
    364390        if (cRelocs > 0)
    365391        {
     
    380406            bool const fIsPData  = fInBinary
    381407                                && memcmp(paShdrs[i].Name, RT_STR_TUPLE(".pdata\0")) == 0;
     408            bool const fIsText   = fInBinary
     409                                && (paShdrs[i].Characteristics & (IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_CNT_CODE));
     410
     411            /* Whether we've seen any __ImageBase REL32 relocation that may later
     412               be used with array access using the SIB encoding and ADDR32NB. */
     413            bool fSeenImageBase = false;
    382414
    383415            /*
     
    425457                    while (off < 36)
    426458                        off += printf(" ");
    427                     printf(" %s\n",
     459                    printf(" %s %s\n",
    428460                           paRelocs[j].Type < RT_ELEMENTS(g_apszCoffAmd64RelTypes)
    429                            ? g_apszCoffAmd64RelTypes[paRelocs[j].Type] : "unknown");
     461                           ? g_apszCoffAmd64RelTypes[paRelocs[j].Type] : "unknown",
     462                           coffGetSymbolName(&paSymTab[paRelocs[j].SymbolTableIndex], pchStrTab, szShortName));
    430463                }
    431464
     
    469502                    /* These are 1:1 conversions: */
    470503                    case IMAGE_REL_AMD64_ADDR32:
     504#if 1   /* Turns out this is special when wlink is doing DOS/BIOS binaries. */
     505/** @todo this still doesn't work for bs3-cmn-SelProtFar32ToFlat32.obj!! */
     506                        paRelocs[j].Type = IMAGE_REL_I386_ABSOLUTE; /* Note! Don't believe MS pecoff.doc, this works with wlink. */
     507#else
    471508                        paRelocs[j].Type = IMAGE_REL_I386_DIR32;
    472509                        uDir = IMAGE_REL_AMD64_ADDR32;
     510#endif
    473511                        break;
    474512                    case IMAGE_REL_AMD64_ADDR32NB:
    475                         paRelocs[j].Type = IMAGE_REL_I386_DIR32NB;
    476                         uDir = IMAGE_REL_AMD64_ADDR32NB;
     513                        if (fSeenImageBase && fIsText) /* This is voodoo. */
     514                            paRelocs[j].Type = IMAGE_REL_I386_ABSOLUTE; /* Note! Don't believe MS pecoff.doc, this works with wlink. */
     515                        else
     516                        {
     517                            paRelocs[j].Type = IMAGE_REL_I386_DIR32NB;
     518                            uDir = IMAGE_REL_AMD64_ADDR32NB;
     519                        }
    477520                        break;
    478521                    case IMAGE_REL_AMD64_REL32:
    479522                        paRelocs[j].Type = IMAGE_REL_I386_REL32;
     523
     524                        /* This is voodoo! */
     525                        if (   fIsText
     526                            && strcmp(coffGetSymbolName(&paSymTab[paRelocs[j].SymbolTableIndex], pchStrTab, szShortName),
     527                                      "__ImageBase") == 0)
     528                        {
     529                            if (   (uLoc.pu8[-1] & (X86_MODRM_MOD_MASK | X86_MODRM_RM_MASK)) == 5 /* disp32 + wrt */
     530                                && uLoc.pu8[-2] == 0x8d /* LEA */
     531                                && (uLoc.pu8[-3] & (0xf8 | X86_OP_REX_W)) == X86_OP_REX_W /* 64-bit reg */ )
     532                            {
     533                                if (*uLoc.pu32)
     534                                {
     535                                    error(pszFile, "__ImageBase fixup with disp %#x at rva=%#x in section #%u '%-8.8'!\n",
     536                                          *uLoc.pu32, paRelocs[j].u.VirtualAddress, i, paShdrs[i].Name);
     537                                    fRet = false;
     538                                }
     539
     540                                if (fSeenImageBase)
     541                                    return error(pszFile, "More than one __ImageBase fixup! 2nd at rva=%#x in section #%u '%-8.8'\n",
     542                                                 paRelocs[j].u.VirtualAddress, i, paShdrs[i].Name);
     543                                if (g_cVerbose)
     544                                    printf("Applying __ImageBase hack at rva=%#x in section #%u '%-8.8'\n",
     545                                           paRelocs[j].u.VirtualAddress, i, paShdrs[i].Name);
     546
     547                                /* Convert it into a mov reg, dword 0. Leave the extra rex prefix, as it will be ignored. */
     548                                uint8_t iReg = (uLoc.pu8[-1] >> X86_MODRM_REG_SHIFT) & X86_MODRM_REG_SMASK;
     549                                uLoc.pu8[-1] = 0xb8 | iReg;
     550                                uLoc.pu8[-2] = X86_OP_REX_R & uLoc.pu8[-3];
     551                                fSeenImageBase = true;
     552
     553                                /* Neutralize the fixup.
     554                                   Note! wlink takes the IMAGE_REL_I386_ABSOLUTE fixups seriously, so we cannot use that
     555                                         to disable it, so instead we have to actually remove it from the fixup table. */
     556                                cRelocs--;
     557                                if (j != cRelocs)
     558                                    memmove(&paRelocs[j], &paRelocs[j + 1], (cRelocs - j) * sizeof(paRelocs[j]));
     559                                paShdrs[i].NumberOfRelocations = (uint16_t)cRelocs;
     560                                j--;
     561                            }
     562                            else
     563                            {
     564                                error(pszFile, "__ImageBase fixup that isn't a recognized LEA at rva=%#x in section #%u '%-8.8'!\n",
     565                                      paRelocs[j].u.VirtualAddress, i, paShdrs[i].Name);
     566                                fRet = false;
     567                            }
     568                        }
    480569                        break;
    481570                    case IMAGE_REL_AMD64_SECTION:
     
    488577                        paRelocs[j].Type = IMAGE_REL_I386_SECREL7;
    489578                        break;
    490                     case IMAGE_REL_AMD64_ABSOLUTE: /* no-op for alignment. */
     579                    case IMAGE_REL_AMD64_ABSOLUTE:
    491580                        paRelocs[j].Type = IMAGE_REL_I386_ABSOLUTE;
     581                        /* Turns out wlink takes this seriously, so it usage must be checked out. */
     582                        error(pszFile, "ABSOLUTE fixup at rva=%#x in section #%u '%-8.8'\n",
     583                              paRelocs[j].u.VirtualAddress, i, paShdrs[i].Name);
     584                        fRet = false;
    492585                        break;
    493586
注意: 瀏覽 TracChangeset 來幫助您使用更動檢視器

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