VirtualBox

Changeset 99551 in vbox for trunk/src/bldprogs


Ignore:
Timestamp:
Apr 27, 2023 6:12:59 PM (19 months ago)
Author:
vboxsync
Message:

VBoxDef2LazyLoad: Deal with DATA entries (was ignored).

The DATA entries cannot easily be done in a lazy nor in a transparent fashion,
since the compiler does not call any code when accessing data. The compiler
does not necessarily generate an indirect reference to it (e.g. ELF executable
images seems to define the variable locally in the .exe image and rely on
unix-style global symbol resoltion for the .so to pick it up). So, instead we
require special header file writing for data symbols.

Given the variable uint64_t g_uData; in an .so. We create the def-file line
g_uData DATA for it. In the header file, we replace the
extern uint64_t g_uData; with DECLASM(uint64_t *) LazyGetPtr_g_uData(void);
and #define g_uData (*LazyGetPtr_g_uData()).

For code that uses the explicit load function, it would also be possible to
us the pointer variable extern uint64_t *g_pg_uData; directly via wrapper
#define g_uData (*g_pg_uData), but do that with great care as the any
init ordering mishaps will cause accesses to g_uData to crash.

File:
1 edited

Legend:

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

    r99540 r99551  
    5151    char const         *pszExportedNm;
    5252    unsigned            uOrdinal;
     53    /** NONAME.  */
    5354    bool                fNoName;
     55    /** DATA symbol if true, otherwise function. */
     56    bool                fData;
    5457    char                szName[1];
    5558} MYEXPORT;
     
    227230            }
    228231
     232            bool fData = false;
    229233            while (*psz)
    230234            {
     
    232236                if (WORD_CMP(psz, cch, "DATA"))
    233237                {
     238                    fData = true;
    234239                    if (!g_fIgnoreData)
    235240                    {
     
    239244                    }
    240245                }
    241                 else if (!WORD_CMP(psz, cch, "PRIVATE"))
     246                else if (WORD_CMP(psz, cch, "PRIVATE"))
    242247                {
    243                     fprintf(stderr, "%s:%u: error: Cannot process DATA export '%.*s'.\n",
     248                    fprintf(stderr, "%s:%u: error: Cannot process PRIVATE export '%.*s'.\n",
    244249                            pszInput, iLine, cchName, pchName);
    245250                    return RTEXITCODE_SUCCESS;
     251                }
     252                else
     253                {
     254                    fprintf(stderr, "%s:%u: error: Unknown keyword: %.*s.\n", pszInput, iLine, cch, psz);
     255                    return RTEXITCODE_FAILURE;
    246256                }
    247257                psz = leftStrip(psz + cch);
     
    266276             * Add the export.
    267277             */
    268 
    269278            PMYEXPORT pExp = (PMYEXPORT)malloc(cbExp);
    270279            if (!pExp)
    271280            {
    272281                fprintf(stderr, "%s:%u: error: Out of memory.\n", pszInput, iLine);
    273                 return RTEXITCODE_SUCCESS;
     282                return RTEXITCODE_FAILURE;
    274283            }
    275284            memcpy(pExp->szName, pchName, cchName);
     
    289298            pExp->uOrdinal   = uOrdinal;
    290299            pExp->fNoName    = fNoName;
     300            pExp->fData      = fData;
    291301            pExp->pNext      = NULL;
    292302            *g_ppExpNext     = pExp;
     
    372382            "BEGINCODE\n");
    373383    for (PMYEXPORT pExp = g_pExpHead; pExp; pExp = pExp->pNext)
    374         if (!pExp->pszUnstdcallName)
     384        if (pExp->fData)
     385            fprintf(pOutput,
     386                    "BEGINPROC LazyGetPtr_%s\n"
     387                    "    mov   xAX, [NAME(g_p%s) xWrtRIP]\n"
     388                    "    test  xAX, xAX\n"
     389                    "    jz    ___LazyLoad___%s\n"
     390                    "    ret\n"
     391                    "ENDPROC   LazyGetPtr_%s\n",
     392                    pExp->szName, pExp->szName, pExp->szName, pExp->szName);
     393        else if (!pExp->pszUnstdcallName)
    375394            fprintf(pOutput,
    376395                    "BEGINPROC %s\n"
    377                     "    jmp   RTCCPTR_PRE [g_pfn%s xWrtRIP]\n"
     396                    "    jmp   RTCCPTR_PRE [NAME(g_pfn%s) xWrtRIP]\n"
    378397                    "ENDPROC   %s\n",
    379398                    pExp->szName, pExp->szName, pExp->szName);
     
    383402                    "global    %s\n"
    384403                    "%s:\n"
    385                     "    jmp   RTCCPTR_PRE [g_pfn%s xWrtRIP]\n"
     404                    "    jmp   RTCCPTR_PRE [NAME(g_pfn%s) xWrtRIP]\n"
    386405                    "%%else\n"
    387406                    "BEGINPROC %s\n"
    388                     "    jmp   RTCCPTR_PRE [g_pfn%s xWrtRIP]\n"
     407                    "    jmp   RTCCPTR_PRE [NAME(g_pfn%s) xWrtRIP]\n"
    389408                    "ENDPROC   %s\n"
    390409                    "%%endif\n",
     
    406425            "g_apfnImports:\n");
    407426    for (PMYEXPORT pExp = g_pExpHead; pExp; pExp = pExp->pNext)
    408         if (pExp->pszUnstdcallName)
     427        if (pExp->fData)
     428            fprintf(pOutput,
     429                    "%%ifdef ASM_FORMAT_PE\n"
     430                    ";@todo\n"
     431                    "%%endif\n"
     432                    "global NAME(g_p%s)\n"
     433                    "NAME(g_p%s): RTCCPTR_DEF 0\n",
     434                    pExp->pszExportedNm, pExp->pszExportedNm);
     435        else if (pExp->pszUnstdcallName)
    409436            fprintf(pOutput,
    410437                    "%%ifdef ASM_FORMAT_PE\n"
     
    417444                    " %%endif\n"
    418445                    "%%endif\n"
    419                     "g_pfn%s RTCCPTR_DEF ___LazyLoad___%s\n"
     446                    "NAME(g_pfn%s) RTCCPTR_DEF ___LazyLoad___%s\n"
    420447                    "\n",
    421448                    pExp->szName,
     
    431458                    "__imp_%s:\n"
    432459                    "%%endif\n"
    433                     "g_pfn%s RTCCPTR_DEF ___LazyLoad___%s\n"
     460                    "NAME(g_pfn%s) RTCCPTR_DEF ___LazyLoad___%s\n"
    434461                    "\n",
    435462                    pExp->szName,
     
    486513                    "%%ifdef RT_ARCH_AMD64\n"
    487514                    "    lea     rax, [g_sz%s wrt rip]\n"
    488                     "    lea     r10, [g_pfn%s wrt rip]\n"
     515                    "    lea     r10, [NAME(g_p%s%s) wrt rip]\n"
    489516                    "    call    LazyLoadResolver\n"
    490517                    "%%elifdef RT_ARCH_X86\n"
    491518                    "    push    g_sz%s\n"
    492                     "    push    g_pfn%s\n"
     519                    "    push    NAME(g_p%s%s)\n"
    493520                    "    call    LazyLoadResolver\n"
    494521                    "    add     esp, 8h\n"
     
    499526                    pExp->pszExportedNm,
    500527                    pExp->pszExportedNm,
     528                    !pExp->fData ? "fn" : "", pExp->pszExportedNm,
    501529                    pExp->pszExportedNm,
    502                     pExp->pszExportedNm,
    503                     pExp->pszExportedNm);
     530                    !pExp->fData ? "fn" : "", pExp->pszExportedNm);
    504531        else
    505532            fprintf(pOutput,
     
    508535                    "%%ifdef RT_ARCH_AMD64\n"
    509536                    "    mov     eax, %u\n"
    510                     "    lea     r10, [g_pfn%s wrt rip]\n"
     537                    "    lea     r10, [NAME(g_p%s%s) wrt rip]\n"
    511538                    "    call    LazyLoadResolver\n"
    512539                    "%%elifdef RT_ARCH_X86\n"
    513540                    "    push    %u\n"
    514                     "    push    g_pfn%s\n"
     541                    "    push    NAME(g_p%s%s)\n"
    515542                    "    call    LazyLoadResolver\n"
    516543                    "    add     esp, 8h\n"
     
    521548                    pExp->pszExportedNm,
    522549                    pExp->uOrdinal,
    523                     pExp->pszExportedNm,
     550                    !pExp->fData ? "fn" : "", pExp->pszExportedNm,
    524551                    pExp->uOrdinal,
    525                     pExp->pszExportedNm);
    526         if (!pExp->pszUnstdcallName)
     552                    !pExp->fData ? "fn" : "", pExp->pszExportedNm);
     553        if (pExp->fData)
     554            fprintf(pOutput, "    jmp     NAME(LazyGetPtr_%s)\n", pExp->szName);
     555        else if (!pExp->pszUnstdcallName)
    527556            fprintf(pOutput, "    jmp     NAME(%s)\n", pExp->szName);
    528557        else
     
    10991128            ".section __TEXT,__text,regular,pure_instructions\n");
    11001129    for (PMYEXPORT pExp = g_pExpHead; pExp; pExp = pExp->pNext)
    1101         fprintf(pOutput,
    1102                 ".p2align 3\n"
    1103                 ".globl %s%s\n"
    1104                 "%s%s:\n"
    1105                 "    adrp    x9, %sg_pfn%s@PAGE\n"
    1106                 "    ldr     x9, [x9, %sg_pfn%s@PAGEOFF]\n"
    1107                 "    br      x9\n",
    1108                 pszNmPfx, pExp->szName, pszNmPfx, pExp->szName, pszNmPfx, pExp->szName, pszNmPfx, pExp->szName);
     1130        if (!pExp->fData)
     1131            fprintf(pOutput,
     1132                    ".p2align 3\n"
     1133                    ".globl %s%s\n"
     1134                    "%s%s:\n"
     1135                    "    adrp    x9, %sg_pfn%s@PAGE\n"
     1136                    "    ldr     x9, [x9, %sg_pfn%s@PAGEOFF]\n"
     1137                    "    br      x9\n",
     1138                    pszNmPfx, pExp->szName, pszNmPfx, pExp->szName, pszNmPfx, pExp->szName, pszNmPfx, pExp->szName);
     1139        else
     1140            fprintf(pOutput,
     1141                    ".p2align 3\n"
     1142                    ".globl %sLazyGetPtr_%s\n"
     1143                    "%sLazyGetPtr_%s:\n"
     1144                    "    adrp    x9, %sg_p%s@PAGE\n"
     1145                    "    ldr     x9, [x9, %sg_p%s@PAGEOFF]\n"
     1146                    "    cmp     x9, #0\n"
     1147                    "    b.ne    ___LazyLoad___%s\n"
     1148                    "    mov     x0, x9\n"
     1149                    "    ret\n",
     1150                    pszNmPfx, pExp->szName, pszNmPfx, pExp->szName, pszNmPfx, pExp->szName, pszNmPfx, pExp->szName, pExp->pszExportedNm);
    11091151    fprintf(pOutput,
    11101152            "\n"
     
    11221164            "g_apfnImports:\n");
    11231165    for (PMYEXPORT pExp = g_pExpHead; pExp; pExp = pExp->pNext)
    1124         fprintf(pOutput,
    1125                 ".globl __imp_%s\n"
    1126                 "__imp_%s:\n"
    1127                 ".globl %sg_pfn%s\n"
    1128                 "%sg_pfn%s:\n"
    1129                 "    .quad ___LazyLoad___%s\n"
    1130                 "\n",
    1131                 pExp->szName, pExp->szName,
    1132                 pszNmPfx, pExp->szName, pszNmPfx, pExp->szName,
    1133                 pExp->pszExportedNm);
     1166        if (!pExp->fData)
     1167            fprintf(pOutput,
     1168                    ".globl __imp_%s\n"
     1169                    "__imp_%s:\n"
     1170                    ".globl %sg_pfn%s\n"
     1171                    "%sg_pfn%s:\n"
     1172                    "    .quad ___LazyLoad___%s\n"
     1173                    "\n",
     1174                    pExp->szName, pExp->szName,
     1175                    pszNmPfx, pExp->szName, pszNmPfx, pExp->szName,
     1176                    pExp->pszExportedNm);
     1177        else
     1178            fprintf(pOutput,
     1179                    ".globl %sg_p%s\n"
     1180                    "%sg_p%s:\n"
     1181                    "    .quad 0\n"
     1182                    "\n",
     1183                    pszNmPfx, pExp->szName, pszNmPfx, pExp->szName);
    11341184    fprintf(pOutput,
    11351185            "    .quad 0 ; Terminator entry for traversal.\n"
     
    11821232                    "    adrp    x9, g_sz%s@PAGE\n"
    11831233                    "    add     x9, x9, g_sz%s@PAGEOFF\n"
    1184                     "    adrp    x10, %sg_pfn%s@PAGE\n"
    1185                     "    add     x10, x10, %sg_pfn%s@PAGEOFF\n"
     1234                    "    adrp    x10, %sg_p%s%s@PAGE\n"
     1235                    "    add     x10, x10, %sg_p%s%s@PAGEOFF\n"
    11861236                    "    bl      LazyLoadResolver\n"
    11871237                    , pExp->pszExportedNm,
    11881238                    pExp->pszExportedNm, pExp->pszExportedNm,
    1189                     pszNmPfx, pExp->pszExportedNm, pszNmPfx, pExp->pszExportedNm);
     1239                    pszNmPfx, !pExp->fData ? "fn" : "", pExp->pszExportedNm,
     1240                    pszNmPfx, !pExp->fData ? "fn" : "", pExp->pszExportedNm);
    11901241        else
    11911242            fprintf(pOutput,
     
    11971248                    pExp->uOrdinal,
    11981249                    pszNmPfx, pExp->pszExportedNm, pszNmPfx, pExp->pszExportedNm);
    1199         fprintf(pOutput, "    b       %s%s\n", pszNmPfx, pExp->szName);
     1250        if (!pExp->fData)
     1251            fprintf(pOutput, "    b       %s%s\n", pszNmPfx, pExp->szName);
     1252        else
     1253            fprintf(pOutput, "    b       %sLazyGetPtr_%s\n", pszNmPfx, pExp->szName);
    12001254        fprintf(pOutput, "\n");
    12011255    }
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