VirtualBox

Changeset 108669 in vbox for trunk/src


Ignore:
Timestamp:
Mar 20, 2025 5:25:30 PM (8 weeks ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
168082
Message:

include/iprt/asmdefs-arm.h,bldprogs/VBoxDef2LazyLoad.cpp: Make the lazy loader work in PIC mode where we need to go through global offset table (GOT) while keeping it working for non PIC code (guest additions), bugref:10391

File:
1 edited

Legend:

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

    r108510 r108669  
    11321132                    ".globl NAME(%s)\n"
    11331133                    "NAME(%s):\n"
     1134                    "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1135                    "    adrp    x9, PAGE_GOT(NAME(g_pfn%s))\n"
     1136                    "    ldr     x9, [x9, PAGEOFF_GOT(NAME(g_pfn%s))]\n"
     1137                    "#else\n"
    11341138                    "    adrp    x9, PAGE(NAME(g_pfn%s))\n"
    11351139                    "    ldr     x9, [x9, PAGEOFF(NAME(g_pfn%s))]\n"
     1140                    "#endif\n"
    11361141                    "    br      x9\n",
    1137                     pExp->pszExportedNm, pExp->pszExportedNm, pExp->pszExportedNm, pExp->pszExportedNm);
     1142                    pExp->pszExportedNm, pExp->pszExportedNm, pExp->pszExportedNm, pExp->pszExportedNm,
     1143                    pExp->pszExportedNm, pExp->pszExportedNm);
    11381144        else
    11391145            fprintf(pOutput,
     
    11411147                    ".globl NAME(LazyGetPtr_%s)\n"
    11421148                    "NAME(LazyGetPtr_%s):\n"
     1149                    "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1150                    "    adrp    x9, PAGE_GOT(NAME(g_LazyPtr_%s))\n"
     1151                    "    ldr     x9, [x9, PAGEOFF_GOT(NAME(g_LazyPtr_%s))]\n"
     1152                    "#else\n"
    11431153                    "    adrp    x9, PAGE(NAME(g_LazyPtr_%s))\n"
    11441154                    "    ldr     x9, [x9, PAGEOFF(NAME(g_LazyPtr_%s))]\n"
     1155                    "#endif\n"
    11451156                    "    cmp     x9, #0\n"
    11461157                    "    b.eq    ___LazyLoad___%s\n"
    11471158                    "    mov     x0, x9\n"
    11481159                    "    ret\n",
    1149                     pExp->pszExportedNm, pExp->pszExportedNm, pExp->pszExportedNm, pExp->pszExportedNm, pExp->pszExportedNm);
     1160                    pExp->pszExportedNm, pExp->pszExportedNm,
     1161                    pExp->pszExportedNm, pExp->pszExportedNm,
     1162                    pExp->pszExportedNm, pExp->pszExportedNm,
     1163                    pExp->pszExportedNm);
    11501164    fprintf(pOutput,
    11511165            "ENDCODE\n"
     
    12271241            "BEGINCODE\n"
    12281242            ".p2align 3\n");
     1243
    12291244    for (PMYEXPORT pExp = g_pExpHead; pExp; pExp = pExp->pNext)
    12301245    {
     1246        const char *pszPrefix = !pExp->fData ? "g_pfn" : "g_LazyPtr_";
     1247
    12311248        if (!pExp->fNoName)
    12321249            fprintf(pOutput,
    12331250                    "___LazyLoad___%s:\n"
     1251                    "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1252                    "    adrp    x9, PAGE_GOT(g_sz%s)\n"
     1253                    "    ldr     x9, [x9, PAGEOFF_GOT(g_sz%s)]\n"
     1254                    "    adrp    x10, PAGE_GOT(NAME(%s%s))\n"
     1255                    "    ldr     x10, [x10, PAGEOFF_GOT(NAME(%s%s))]\n"
     1256                    "#else\n"
    12341257                    "    adrp    x9, PAGE(g_sz%s)\n"
    12351258                    "    add     x9, x9, PAGEOFF(g_sz%s)\n"
    12361259                    "    adrp    x10, PAGE(NAME(%s%s))\n"
    12371260                    "    add     x10, x10, PAGEOFF(NAME(%s%s))\n"
     1261                    "#endif\n"
    12381262                    "    mov     x16, x30\n"
    12391263                    "    bl      LazyLoadResolver\n"
    12401264                    "    mov     x30, x16\n"
    12411265                    , pExp->pszExportedNm,
     1266                    /* #if defined(ASM_FORMAT_ELF) && defined(PIC) */
    12421267                    pExp->pszExportedNm, pExp->pszExportedNm,
    1243                     !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm,
    1244                     !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm);
     1268                    pszPrefix, pExp->pszExportedNm,
     1269                    pszPrefix, pExp->pszExportedNm,
     1270                    /* #else */
     1271                    pExp->pszExportedNm, pExp->pszExportedNm,
     1272                    pszPrefix, pExp->pszExportedNm,
     1273                    pszPrefix, pExp->pszExportedNm);
    12451274        else
    12461275            fprintf(pOutput,
    12471276                    "___LazyLoad___%s:\n"
    12481277                    "    movk    w9, #%u\n"
     1278                    "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1279                    "    adrp    x10, PAGE_GOT(NAME(%s%s))\n"
     1280                    "    ldr     x10, [x10, PAGEOFF_GOT(NAME(%s%s))]\n"
     1281                    "#else\n"
    12491282                    "    adrp    x10, PAGE(NAME(%s%s))\n"
    12501283                    "    add     x10, x10, PAGEOFF(NAME(%s%s))\n"
     1284                    "#endif\n"
    12511285                    , pExp->pszExportedNm,
    12521286                    pExp->uOrdinal,
    1253                     !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm,
    1254                     !pExp->fData ? "g_pfn" : "g_LazyPtr_", pExp->pszExportedNm);
     1287                    /* #if defined(ASM_FORMAT_ELF) && defined(PIC) */
     1288                    pszPrefix, pExp->pszExportedNm,
     1289                    pszPrefix, pExp->pszExportedNm,
     1290                    /* #else */
     1291                    pszPrefix, pExp->pszExportedNm,
     1292                    pszPrefix, pExp->pszExportedNm);
    12551293        if (!pExp->fData)
    12561294            fprintf(pOutput, "    b       NAME(%s)\n", pExp->pszExportedNm);
     
    13311369            "\n"
    13321370            "    /* Get the module handle and call RTLdrGetSymbol(RTLDRMOD hLdrMod, const char *pszSymbol, void **ppvValue) */\n"
     1371            "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1372            "    adrp    x0, PAGE_GOT(g_hMod)\n"
     1373            "    ldr     x0, [x0, PAGEOFF_GOT(g_hMod)]\n"
     1374            "#else\n"
    13331375            "    adrp    x0, PAGE(g_hMod)\n"
    13341376            "    ldr     x0, [x0, PAGEOFF(g_hMod)]\n"
     1377            "#endif\n"
    13351378            "    cmp     x0, #0\n"
    13361379            "    b.ne    Lloaded\n"
     
    13461389            "Lbadsym: /* Call sRTAssertMsg2Weak. Variadic (...) arguments are passed on the stack it seems. */\n"
    13471390            "    mov     x3, x0\n"
     1391            "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1392            "    adrp    x2, PAGE_GOT(g_szLibrary)\n"
     1393            "    ldr     x2, [x2, PAGEOFF_GOT(g_szLibrary)]\n"
     1394            "#else\n"
    13481395            "    adrp    x2, PAGE(g_szLibrary)\n"
    13491396            "    add     x2, x2, PAGEOFF(g_szLibrary)\n"
     1397            "#endif\n"
    13501398            "    mov     x1, x19\n"
     1399            "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1400            "    adrp    x0, PAGE_GOT(g_szFailLoadFmt)\n"
     1401            "    ldr     x0, [x0, PAGEOFF_GOT(g_szFailLoadFmt)]\n"
     1402            "#else\n"
    13511403            "    adrp    x0, PAGE(g_szFailLoadFmt)\n"
    13521404            "    add     x0, x0, PAGEOFF(g_szFailLoadFmt)\n"
     1405            "#endif\n"
    13531406            "    stp     x1, x2, [sp]\n"
    13541407            "    str     x3,     [sp, #16]\n"
     
    14171470                "    mov     x3, #0\n"
    14181471                "    mov     x2, #0\n"
     1472                "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1473                "    adrp    x1, PAGE_GOT(g_hMod)\n"
     1474                "    ldr     x1, [x1, PAGEOFF_GOT(g_hMod)]\n"
     1475                "    adrp    x0, PAGE_GOT(g_szLibrary)\n"
     1476                "    ldr     x0, [x0, PAGEOFF_GOT(g_szLibrary)]\n"
     1477                "#else\n"
    14191478                "    adrp    x1, PAGE(g_hMod)\n"
    14201479                "    add     x1, x1, PAGEOFF(g_hMod)\n"
    14211480                "    adrp    x0, PAGE(g_szLibrary)\n"
    14221481                "    add     x0, x0, PAGEOFF(g_szLibrary)\n"
     1482                "#endif\n"
    14231483                "    bl      NAME(SUPR3HardenedLdrLoadAppPriv)\n");
    14241484    else
    14251485        fprintf(pOutput,
    14261486                "    /* Call RTLdrLoadSystem(const char *pszFilename, bool fNoUnload, PRTLDRMOD phLdrMod); */\n"
     1487                "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1488                "    adrp    x2, PAGE_GOT(g_hMod)\n"
     1489                "    ldr     x2, [x2, PAGEOFF_GOT(g_hMod)]\n"
     1490                "#else\n"
    14271491                "    adrp    x2, PAGE(g_hMod)\n"
    14281492                "    add     x2, x2, PAGEOFF(g_hMod)\n"
     1493                "#endif\n"
    14291494                "    mov     x1, #1\n"
     1495                "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1496                "    adrp    x0, PAGE_GOT(g_szLibrary)\n"
     1497                "    ldr     x0, [x0, PAGEOFF_GOT(g_szLibrary)]\n"
     1498                "#else\n"
    14301499                "    adrp    x0, PAGE(g_szLibrary)\n"
    14311500                "    add     x0, x0, PAGEOFF(g_szLibrary)\n"
     1501                "#endif\n"
    14321502                "    bl      NAME(RTLdrLoadSystem)\n");
    14331503
     
    14381508            "Lbadload: /* Call sRTAssertMsg2Weak. Variadic (...) arguments are passed on the stack it seems. */\n"
    14391509            "    mov     x2, x0\n"
     1510            "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1511            "    adrp    x1, PAGE_GOT(g_szLibrary)\n"
     1512            "    ldr     x1, [x1, PAGEOFF_GOT(g_szLibrary)]\n"
     1513            "    adrp    x0, PAGE_GOT(g_szFailResolveFmt)\n"
     1514            "    ldr     x0, [x0, PAGEOFF_GOT(g_szFailResolveFmt)]\n"
     1515            "#else\n"
    14401516            "    adrp    x1, PAGE(g_szLibrary)\n"
    14411517            "    add     x1, x1, PAGEOFF(g_szLibrary)\n"
    14421518            "    adrp    x0, PAGE(g_szFailResolveFmt)\n"
    14431519            "    add     x0, x0, PAGEOFF(g_szFailResolveFmt)\n"
     1520            "#endif\n"
    14441521            "    stp     x1, x2, [sp]\n"
    14451522            "    bl      NAME(RTAssertMsg2Weak)\n"
     
    14981575                "     * Is the module already loaded?\n"
    14991576                "     */\n"
     1577                "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1578                "    adrp    x0, PAGE_GOT(g_hMod)\n"
     1579                "    ldr     x0, [x0, PAGEOFF_GOT(g_hMod)]\n"
     1580                "#else\n"
    15001581                "    adrp    x0, PAGE(g_hMod)\n"
    15011582                "    ldr     x0, [x0, PAGEOFF(g_hMod)]\n"
     1583                "#endif\n"
    15021584                "    cmp     x0, #0\n"
    15031585                "    b.ne    Lexplicit_loaded_module\n"
     
    15141596                    "    mov     x3, x21\n"
    15151597                    "    mov     x2, #0\n"
     1598                    "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1599                    "    adrp    x1, PAGE_GOT(g_hMod)\n"
     1600                    "    ldr     x1, [x1, PAGEOFF_GOT(g_hMod)]\n"
     1601                    "    adrp    x0, PAGE_GOT(g_szLibrary)\n"
     1602                    "    ldr     x0, [x0, PAGEOFF_GOT(g_szLibrary)]\n"
     1603                    "#else\n"
    15161604                    "    adrp    x1, PAGE(g_hMod)\n"
    15171605                    "    add     x1, x1, PAGEOFF(g_hMod)\n"
    15181606                    "    adrp    x0, PAGE(g_szLibrary)\n"
    15191607                    "    add     x0, x0, PAGEOFF(g_szLibrary)\n"
     1608                    "#endif\n"
    15201609                    "    bl      NAME(SUPR3HardenedLdrLoadAppPriv)\n");
    15211610        else
    15221611            fprintf(pOutput,
    15231612                    "    /* Call RTLdrLoadSystem(const char *pszFilename, bool fNoUnload, PRTLDRMOD phLdrMod); */\n"
     1613                    "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1614                    "    adrp    x2, PAGE_GOT(g_hMod)\n"
     1615                    "    ldr     x2, [x2, PAGEOFF_GOT(g_hMod)]\n"
     1616                    "#else\n"
    15241617                    "    adrp    x2, PAGE(g_hMod)\n"
    15251618                    "    add     x2, x2, PAGEOFF(g_hMod)\n"
     1619                    "#endif\n"
    15261620                    "    mov     x1, #1\n"
     1621                    "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1622                    "    adrp    x0, PAGE_GOT(g_szLibrary)\n"
     1623                    "    ldr     x0, [x0, PAGEOFF_GOT(g_szLibrary)]\n"
     1624                    "#else\n"
    15271625                    "    adrp    x0, PAGE(g_szLibrary)\n"
    15281626                    "    add     x0, x0, PAGEOFF(g_szLibrary)\n"
     1627                    "#endif\n"
    15291628                    "    bl      NAME(RTLdrLoadSystem)\n");
    15301629        fprintf(pOutput,
     
    15411640                "    b.eq    Lexplicit_load_return\n"
    15421641                "\n"
     1642                "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1643                "    adrp     x22, PAGE_GOT(g_szzNames)\n"
     1644                "    ldr      x22, [x22, PAGEOFF_GOT(g_szzNames)]\n"
     1645                "    adrp     x23, PAGE_GOT(g_apfnImports)\n"
     1646                "    ldr      x23, [x23, PAGEOFF_GOT(g_apfnImports)]\n"
     1647                "#else\n"
    15431648                "    adrp     x22, PAGE(g_szzNames)\n"
    15441649                "    add      x22, x22, PAGEOFF(g_szzNames)\n"
    15451650                "    adrp     x23, PAGE(g_apfnImports)\n"
    15461651                "    add      x23, x23, PAGEOFF(g_apfnImports)\n"
     1652                "#endif\n"
    15471653                "Lexplicit_load_next_import:\n"
    15481654                "    ldr     x0, [x23]\n"
     
    15511657                "\n"
    15521658                "    /* Get the module handle and call RTLdrGetSymbol(RTLDRMOD hLdrMod, const char *pszSymbol, void **ppvValue) */\n"
     1659                "#if defined(ASM_FORMAT_ELF) && defined(PIC)\n"
     1660                "    adrp    x0, PAGE_GOT(g_hMod)\n"
     1661                "    ldr     x0, [x0, PAGEOFF_GOT(g_hMod)]\n"
     1662                "#else\n"
    15531663                "    adrp    x0, PAGE(g_hMod)\n"
    15541664                "    ldr     x0, [x0, PAGEOFF(g_hMod)]\n"
     1665                "#endif\n"
    15551666                "    mov     x1, x22\n"
    15561667                "    mov     x2, x23\n"
Note: See TracChangeset for help on using the changeset viewer.

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