VirtualBox

Changeset 99552 in vbox


Ignore:
Timestamp:
Apr 27, 2023 8:16:20 PM (19 months ago)
Author:
vboxsync
Message:

VBoxDef2LazyLoad: Use g_LazyPtr_ instead of g_p as prefix for data symbol pointers, as these are in the global space. Improved the documentation a little bit.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bldprogs/VBoxDef2LazyLoad.cpp

    r99551 r99552  
    385385            fprintf(pOutput,
    386386                    "BEGINPROC LazyGetPtr_%s\n"
    387                     "    mov   xAX, [NAME(g_p%s) xWrtRIP]\n"
     387                    "    mov   xAX, [NAME(g_LazyPtr_%s) xWrtRIP]\n"
    388388                    "    test  xAX, xAX\n"
    389389                    "    jz    ___LazyLoad___%s\n"
     
    430430                    ";@todo\n"
    431431                    "%%endif\n"
    432                     "global NAME(g_p%s)\n"
    433                     "NAME(g_p%s): RTCCPTR_DEF 0\n",
     432                    "global NAME(g_LazyPtr_%s)\n"
     433                    "NAME(g_LazyPtr_%s): RTCCPTR_DEF 0\n",
    434434                    pExp->pszExportedNm, pExp->pszExportedNm);
    435435        else if (pExp->pszUnstdcallName)
     
    513513                    "%%ifdef RT_ARCH_AMD64\n"
    514514                    "    lea     rax, [g_sz%s wrt rip]\n"
    515                     "    lea     r10, [NAME(g_p%s%s) wrt rip]\n"
     515                    "    lea     r10, [NAME(%s%s) wrt rip]\n"
    516516                    "    call    LazyLoadResolver\n"
    517517                    "%%elifdef RT_ARCH_X86\n"
    518518                    "    push    g_sz%s\n"
    519                     "    push    NAME(g_p%s%s)\n"
     519                    "    push    NAME(%s%s)\n"
    520520                    "    call    LazyLoadResolver\n"
    521521                    "    add     esp, 8h\n"
     
    526526                    pExp->pszExportedNm,
    527527                    pExp->pszExportedNm,
    528                     !pExp->fData ? "fn" : "", pExp->pszExportedNm,
     528                    !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm,
    529529                    pExp->pszExportedNm,
    530                     !pExp->fData ? "fn" : "", pExp->pszExportedNm);
     530                    !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm);
    531531        else
    532532            fprintf(pOutput,
     
    535535                    "%%ifdef RT_ARCH_AMD64\n"
    536536                    "    mov     eax, %u\n"
    537                     "    lea     r10, [NAME(g_p%s%s) wrt rip]\n"
     537                    "    lea     r10, [NAME(%s%s) wrt rip]\n"
    538538                    "    call    LazyLoadResolver\n"
    539539                    "%%elifdef RT_ARCH_X86\n"
    540540                    "    push    %u\n"
    541                     "    push    NAME(g_p%s%s)\n"
     541                    "    push    NAME(%s%s)\n"
    542542                    "    call    LazyLoadResolver\n"
    543543                    "    add     esp, 8h\n"
     
    548548                    pExp->pszExportedNm,
    549549                    pExp->uOrdinal,
    550                     !pExp->fData ? "fn" : "", pExp->pszExportedNm,
     550                    !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm,
    551551                    pExp->uOrdinal,
    552                     !pExp->fData ? "fn" : "", pExp->pszExportedNm);
     552                    !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm);
    553553        if (pExp->fData)
    554554            fprintf(pOutput, "    jmp     NAME(LazyGetPtr_%s)\n", pExp->szName);
     
    11421142                    ".globl %sLazyGetPtr_%s\n"
    11431143                    "%sLazyGetPtr_%s:\n"
    1144                     "    adrp    x9, %sg_p%s@PAGE\n"
    1145                     "    ldr     x9, [x9, %sg_p%s@PAGEOFF]\n"
     1144                    "    adrp    x9, %sg_LazyPtr_%s@PAGE\n"
     1145                    "    ldr     x9, [x9, %sg_LazyPtr_%s@PAGEOFF]\n"
    11461146                    "    cmp     x9, #0\n"
    11471147                    "    b.ne    ___LazyLoad___%s\n"
     
    11771177        else
    11781178            fprintf(pOutput,
    1179                     ".globl %sg_p%s\n"
    1180                     "%sg_p%s:\n"
     1179                    ".globl %sg_LazyPtr_%s\n"
     1180                    "%sg_LazyPtr_%s:\n"
    11811181                    "    .quad 0\n"
    11821182                    "\n",
     
    12321232                    "    adrp    x9, g_sz%s@PAGE\n"
    12331233                    "    add     x9, x9, g_sz%s@PAGEOFF\n"
    1234                     "    adrp    x10, %sg_p%s%s@PAGE\n"
    1235                     "    add     x10, x10, %sg_p%s%s@PAGEOFF\n"
     1234                    "    adrp    x10, %s%s%s@PAGE\n"
     1235                    "    add     x10, x10, %s%s%s@PAGEOFF\n"
    12361236                    "    bl      LazyLoadResolver\n"
    12371237                    , pExp->pszExportedNm,
    12381238                    pExp->pszExportedNm, pExp->pszExportedNm,
    1239                     pszNmPfx, !pExp->fData ? "fn" : "", pExp->pszExportedNm,
    1240                     pszNmPfx, !pExp->fData ? "fn" : "", pExp->pszExportedNm);
     1239                    pszNmPfx, !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm,
     1240                    pszNmPfx, !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm);
    12411241        else
    12421242            fprintf(pOutput,
    12431243                    "___LazyLoad___%s:\n"
    12441244                    "    movk    w9, #%u\n"
    1245                     "    adrp    x10, %sg_pfn%s@PAGE\n"
    1246                     "    add     x10, x10, %sg_pfn%s@PAGEOFF\n"
     1245                    "    adrp    x10, %s%s%s@PAGE\n"
     1246                    "    add     x10, x10, %s%s%s@PAGEOFF\n"
    12471247                    , pExp->pszExportedNm,
    12481248                    pExp->uOrdinal,
    1249                     pszNmPfx, pExp->pszExportedNm, pszNmPfx, pExp->pszExportedNm);
     1249                    pszNmPfx, !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm,
     1250                    pszNmPfx, !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm);
    12501251        if (!pExp->fData)
    12511252            fprintf(pOutput, "    b       %s%s\n", pszNmPfx, pExp->szName);
     
    16431644static int usage(const char *pszArgv0)
    16441645{
    1645     printf("usage: %s [options] --libary <loadname> --output <lazyload.asm> <input.def>\n"
     1646    const char *pszTmp = strrchr(pszArgv0, '/');
     1647    if (pszTmp)
     1648        pszArgv0 = pszTmp + 1;
     1649    pszTmp = strrchr(pszArgv0, '\\');
     1650    if (pszTmp)
     1651        pszArgv0 = pszTmp + 1;
     1652
     1653    /*      0         1         2         3         4         5         6         7         8
     1654            012345678901234567890123456789012345678901234567890123456789012345678901234567890 */
     1655    printf("VBoxDef2LazyLoad - Lazy DLL/SO/DYLIB loader code generator.\n"
     1656           "Copyright (C) 2013-2016 Oracle Corporation\n"
     1657           "\n"
     1658           "Description:\n"
     1659           "------------\n"
     1660           "\n"
     1661           "Takes a Microsoft-style linker definition file for a library (DLL/SO/DYLIB) and\n"
     1662           "generates assembly code which defines stub functions that lazily loads and\n"
     1663           "resolves the real symbols before calling them. This is entirely transparent when\n"
     1664           "used with functions.\n"
     1665           "\n"
     1666           "With data symbols it's more messy since the compiler will not invoke code when\n"
     1667           "using them, but access them directly (ELF executables) or indirectly (ELF SOs,\n"
     1668           "PE, ++). For data symbols use the DATA keyword after the symbol name in the\n"
     1669           "def-file and modify the header definition from 'extern type symbol;' to:\n"
     1670           "\n"
     1671           "    DECLASM(type *) LazyGetPtr_<symbol>(void);\n"
     1672           "    #define <symbol> (*LazyGetPtr_<symbol>())\n"
     1673           "\n"
     1674           "or, if using --explict-load-function this will work as well:\n"
     1675           "\n"
     1676           "    extern type *g_LazyPtr_<symbol>;\n"
     1677           "    #define <symbol> (*g_LazyPtr_)\n"
     1678           "\n"
     1679           "Usage:\n"
     1680           "------\n"
     1681           "%s [options] --libary <loadname> --output <lazyload.asm> <input.def>\n"
    16461682           "\n"
    16471683           "Options:\n"
     1684           "--------\n"
     1685           "  --library <loadname>, -l <loadname>\n"
     1686           "    The name of the library.  This is what will be passed to RTLdrLoadSystem\n"
     1687           "    or SUPR3HardenedLdrLoadAppPriv.\n"
     1688           "  --output <filename>, -o <filename>\n"
     1689           "    The assembly output file.\n"
    16481690           "  --explicit-load-function, --no-explicit-load-function\n"
    1649            "    Whether to include the explicit load function, default is not to.\n"
     1691           "    Whether to include the explicit load function:\n"
     1692           "      DECLASM(int) ExplicitlyLoad<basename>(bool fResolveAllImports, pErrInfo);\n"
     1693           "    The default is not to include it.\n"
     1694           "  --system\n"
     1695           "    The library is a system DLL to be loaded using RTLdrLoadSystem.\n"
     1696           "    The default is to use SUPR3HardenedLdrLoadAppPriv to load it.\n"
    16501697           "\n"
    1651            "Copyright (C) 2013-2016 Oracle Corporation\n"
    16521698           , pszArgv0);
    16531699
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