Changeset 540


Ignore:
Timestamp:
Aug 6, 2003, 3:07:18 PM (22 years ago)
Author:
bird
Message:

Working!!!.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/emx/src/emxomf/weakld.c

    • Property cvs2svn:cvs-rev changed from 1.15 to 1.16
    r539 r540  
    119119} OMFLIBHDR, *POMFLIBHDR;
    120120#pragma pack()
     121
     122/** OMF library header - for combining with OMFREC. */
     123#pragma pack(1)
     124typedef struct OMFLIBHDRX
     125{
     126  unsigned long     offDict;
     127  unsigned short    cDictBlocks;
     128  unsigned char     fchFlags;
     129} OMFLIBHDRX, *POMFLIBHDRX;
     130#pragma pack()
     131
    121132/** @} */
    122133
     
    226237        WLDSF_EXPORT    = 0x1000,
    227238
     239        /** Internal flag to say that we've already aliased this weak
     240         * in the definition file.
     241         */
     242        WLDSF_WEAKALIASDONE = 0x8000,
    228243    }                   fFlags;
    229244
     
    28792894
    28802895
     2896typedef struct wldGenerateObjEnum_param
     2897{
     2898    /** Output file stream */
     2899    FILE *      phFile;
     2900    /** Number of aliases in current object. (0 means first) */
     2901    unsigned    cAliases;
     2902} WLDGOEPARAM, *PWLDGOEPARAM;
     2903
     2904#define GENERATE_LIBRARY
     2905
    28812906/**
    28822907 * Symbol enumeration callback function of wld_generate_weakobj().
     
    28892914 * @param   pvUser  Pointer to a FILE stream.
    28902915 */
    2891 static int weakobjEnum(PWLD pWld, PWLDSYM pSym, void *pvUser)
     2916static int wldGenerateObjEnum(PWLD pWld, PWLDSYM pSym, void *pvUser)
    28922917{
    28932918    if (pSym->pszWeakName)
    28942919    {
    2895         int     cch = strlen(pSym->pszWeakName);
    2896         int     cchAlias = strlen(pSym->pszName);
    2897         unsigned char uch;
    2898         OMFREC  hdr;
     2920        PWLDGOEPARAM    pParam = (PWLDGOEPARAM)pvUser;
     2921        #pragma pack(1)
     2922        struct omfstuff
     2923        {
     2924            OMFREC  hdr;
     2925            union
     2926            {
     2927                char        ach[640];
     2928                OMFLIBHDRX  libhdr;
     2929            };
     2930        } omf;
     2931        #pragma pack()
     2932        int             cch = strlen(pSym->pszWeakName);
     2933        int             cchAlias = strlen(pSym->pszName);
    28992934
    29002935        WLDINFO(pWld, ("using weak %s for %s", pSym->pszWeakName, pSym->pszName));
     
    29122947        }
    29132948
    2914         /* write header */
    2915         hdr.chType = ALIAS;
    2916         hdr.cb = cchAlias + cch + 3;
    2917         if (fwrite(&hdr, sizeof(hdr), 1, (FILE*)pvUser) != 1)
    2918         {
    2919             wldErr(pWld, "Error occured while writing weak aliases. (1)");
     2949        #ifdef GENERATE_LIBRARY
     2950        /* end the current object? */
     2951        if (pParam->cAliases > 32)
     2952        {
     2953            off_t   off;
     2954            omf.hdr.chType = MODEND;
     2955            omf.hdr.cb = 2;                 
     2956            memset(&omf.ach[0], 0, sizeof(omf.ach));
     2957            off = (ftell(pParam->phFile) + omf.hdr.cb + sizeof(OMFREC)) % 32;
     2958            if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC) + (off ? 32 - off : 0), 1, pParam->phFile) != 1)
     2959            {
     2960                wldErr(pWld, "Error occured while writing weak aliases. (2)");
     2961                return -1;
     2962            }
     2963            pParam->cAliases = 0;
     2964        }
     2965       
     2966        /* make new object ? */
     2967        if (!pParam->cAliases)
     2968        {
     2969            omf.hdr.chType = THEADR;
     2970            omf.hdr.cb = 2 + strlen("weakalias.obj");
     2971            omf.ach[0] = omf.hdr.cb - 2;
     2972            memcpy(&omf.ach[1], "weakalias.obj", omf.hdr.cb - 2);
     2973            omf.ach[cch + 1] = 0;
     2974            if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, pParam->phFile) != 1)
     2975            {
     2976                wldErr(pWld, "Error occured while writing weak aliases. (2)");
     2977                return -1;
     2978            }
     2979        }
     2980        #endif
     2981
     2982        /* Alias record */
     2983        omf.hdr.chType = ALIAS;
     2984        omf.hdr.cb = cchAlias + cch + 3;
     2985        omf.ach[0] = cchAlias;
     2986        memcpy(&omf.ach[1], pSym->pszName, cchAlias);           /* alias */
     2987        omf.ach[cchAlias + 1] = cch;
     2988        memcpy(&omf.ach[cchAlias + 2], pSym->pszWeakName, cch); /* subtitute */
     2989        omf.ach[cchAlias + cch + 2] = 0; /* crc */
     2990        if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, pParam->phFile) != 1)
     2991        {
     2992            wldErr(pWld, "Error occured while writing weak aliases. (2)");
    29202993            return -1;
    29212994        }
    2922 
    2923         /* write alias string */
    2924         uch = cchAlias;
    2925         if (    fwrite(&uch, sizeof(uch), 1, (FILE*)pvUser) != 1
    2926             ||  fwrite(pSym->pszName, cchAlias, 1, (FILE*)pvUser) != 1
    2927                 )
    2928 
    2929         {
    2930             wldErr(pWld, "Error occured while writing weak aliases (2).");
    2931             return -1;
    2932         }
    2933 
    2934         /* write substitute string */
    2935         uch = cch;
    2936         if (    fwrite(&uch, sizeof(uch), 1, (FILE*)pvUser) != 1
    2937             ||  fwrite(pSym->pszWeakName, cch, 1, (FILE*)pvUser) != 1
    2938                 )
    2939 
    2940         {
    2941             wldErr(pWld, "Error occured while writing weak aliases (3).");
    2942             return -1;
    2943         }
    2944 
    2945         /* write substitute CRC */
    2946         uch = 0;
    2947         if (fwrite(&uch, sizeof(uch), 1, (FILE*)pvUser) != 1)
    2948 
    2949         {
    2950             wldErr(pWld, "Error occured while writing weak aliases (4).");
    2951             return -1;
    2952         }
     2995        pParam->cAliases++;
    29532996    }
    29542997    return 0;
     
    29562999
    29573000
    2958 /** Parameter structure for wlddefCallback (module definition parser callback). */
    2959 typedef struct wlddefCallback_param
     3001/** Parameter structure for wldGenerateDefCallback (module definition parser callback). */
     3002typedef struct wldGenerateDefCallback_param
    29603003{
    29613004    /** Linker Instance. */
     
    29673010    /** Our current linenumber index. */
    29683011    unsigned    iLine;
    2969 } WLDDCPARAM, *PWLDDCPARAM;
     3012} WLDGDCPARAM, *PWLDGDCPARAM;
    29703013
    29713014/**
     
    29773020 * @param   pStmt   Statement we're processing.
    29783021 * @param   eToken  Token we're processing.
    2979  * @param   pvArg   Pointer to a WLDDCPARAM structure.
     3022 * @param   pvArg   Pointer to a WLDGDCPARAM structure.
    29803023 * @sketch
    29813024 *
     
    29903033 *  copied to the new file.
    29913034 */
    2992 static int wlddefCallback(struct _md *pMD, const _md_stmt *pStmt, _md_token eToken, void *pvArg)
    2993 {
    2994     PWLDDCPARAM     pParam = (PWLDDCPARAM)pvArg;
     3035static int wldGenerateDefCallback(struct _md *pMD, const _md_stmt *pStmt, _md_token eToken, void *pvArg)
     3036{
     3037    PWLDGDCPARAM     pParam = (PWLDGDCPARAM)pvArg;
    29953038
    29963039    switch (eToken)
     
    30383081                cch = sprintf(szTmp, "  \"%s\" = \"%s\"", pStmt->export.entryname, pSymInt->pszWeakName);
    30393082            else
     3083            {
    30403084                cch = sprintf(szTmp, "  \"%s\" = \"%s\"", pStmt->export.entryname, pSymExp->pszWeakName);
     3085                pSymExp->fFlags |= WLDSF_WEAKALIASDONE;
     3086            }
    30413087            if (pStmt->export.flags & _MDEP_ORDINAL)
    30423088                cch += sprintf(&szTmp[cch], " @%d", pStmt->export.ordinal);
     
    31313177
    31323178    /* zero returns */
    3133     *pszObjName = '\0';
     3179    if (pszObjName)
     3180        *pszObjName = '\0';
    31343181    if (pszDefName)
    31353182        *pszDefName = '\0';
    31363183
    31373184    /*
    3138      * Generate the object file
     3185     * Do the definition file.
    31393186     */
    3140     rc = wldTempFile(pWld, pszObjName, "wk", ".obj");
    3141     if (rc)
    3142         return wldErr(pWld, "Failed to generate temporary object file for weak aliases.");
    3143     WLDINFO(pWld, ("Generating object file '%s' for weak aliases.", pszObjName));
    3144 
    3145     /* open it */
    3146     phFile = fopen(pszObjName, "wr");
    3147     if (phFile)
    3148     {
    3149         #pragma pack(1)
    3150         struct omfstuff
    3151         {
    3152             OMFREC  hdr;
    3153             char ach[256];
    3154         } omf;
    3155         #pragma pack()
    3156         int     cch;
    3157         off_t   offAlias;
    3158 
    3159         /* Write object file header. */
    3160         cch = strlen("wk.obj");
    3161         omf.hdr.chType = THEADR;
    3162         omf.hdr.cb = cch + 2;           /* name + crc */
    3163         omf.ach[0] = cch;           /* module name */
    3164         memcpy(&omf.ach[1], "wk.obj", cch);
    3165         omf.ach[1+cch] = 0;         /* crc */
    3166         fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile);
    3167         /* todo: link386 doesn't like if there are too many alias in one module btw. */
    3168 
    3169 
    3170         /* Make aliases  */
    3171         offAlias = ftell(phFile);       /* save this to see if anything is added. */
    3172         rc = symEnum(pWld, &pWld->Global,
    3173                      WLDSF_WEAK, WLDSF_WEAK,
    3174                      weakobjEnum, phFile);
    3175         if (rc || ftell(phFile) == offAlias)
    3176         {
    3177             if (!rc)
    3178                 WLDINFO(pWld, ("No weak alias needed, deleting file."));
    3179             fclose(phFile);
    3180             remove(pszObjName);
    3181             *pszObjName = '\0';
    3182         }
    3183         else
    3184         {
    3185            /* write end of module */
    3186            omf.hdr.chType = MODEND;
    3187            omf.hdr.cb = 2;
    3188            omf.ach[0] = omf.ach[1] = 0;
    3189            if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile) == 1)
    3190                fclose(phFile);
    3191            else
    3192            {
    3193                wldErr(pWld, "Failed to write to '%s'.", pszObjName);
    3194                rc = -1;
    3195                fclose(phFile);
    3196                remove(pszObjName);
    3197                *pszObjName = '\0';
    3198            }
    3199         }
    3200     }
    3201     else
    3202     {
    3203         wldErr(pWld, "Failed to open '%s' for writing.", pszObjName);
    3204         *pszObjName = '\0';
    3205     }
    3206 
    3207 
    3208     /*
    3209      * Do the definition file.
    3210      *      We don't need to do this if the above code failed or
    3211      *      didn't issue any aliases.
    3212      */
    3213     if (!rc && pWld->pDef && pszDefName && pszObjName[0])
     3187    if (pWld->pDef && pszDefName)
    32143188    {
    32153189        rc = wldTempFile(pWld, pszDefName, "wk", ".def");
     
    32303204                    if (pMD)
    32313205                    {
    3232                         WLDDCPARAM  param;
     3206                        WLDGDCPARAM  param;
    32333207                        param.pWld = pWld;
    32343208                        param.phOrgFile = phOrgFile;
     
    32383212                        /* parse it */
    32393213                        _md_next_token(pMD);
    3240                         rc = _md_parse(pMD, wlddefCallback, &param);
     3214                        rc = _md_parse(pMD, wldGenerateDefCallback, &param);
    32413215                        _md_close(pMD);
    32423216
     
    32623236        }
    32633237        else
    3264             rc = wldErr(pWld, "Failed to generate temporary definition file for weak aliases.");
     3238            wldErr(pWld, "Failed to generate temporary definition file for weak aliases.");
    32653239    }
    32663240
     
    32713245        *pszDefName = '\0';
    32723246    }
     3247
     3248
     3249    /*
     3250     * Generate the object file
     3251     */
     3252    if (!rc && pszObjName)
     3253    {
     3254        #ifdef GENERATE_LIBRARY
     3255        rc = wldTempFile(pWld, pszObjName, "wk", ".lib");
     3256        #else
     3257        rc = wldTempFile(pWld, pszObjName, "wk", ".obj");
     3258        #endif
     3259        if (!rc)
     3260        {
     3261            WLDINFO(pWld, ("Generating object file '%s' for weak aliases.", pszObjName));
     3262
     3263            /* open it */
     3264            phFile = fopen(pszObjName, "wr");
     3265            if (phFile)
     3266            {
     3267                WLDGOEPARAM     param;
     3268                #pragma pack(1)
     3269                struct omfstuff
     3270                {
     3271                    OMFREC  hdr;
     3272                    union
     3273                    {
     3274                        char        ach[256];
     3275                        OMFLIBHDRX  libhdr;
     3276                    };
     3277                }               omf;
     3278                #pragma pack()
     3279                off_t           offAlias;
     3280
     3281                #ifdef GENERATE_LIBRARY
     3282                /* Write library file header. */
     3283                memset(&omf, 0, sizeof(omf));
     3284                omf.hdr.chType = LIBHDR;
     3285                omf.hdr.cb = 32 - 3;
     3286                omf.libhdr.offDict = 0;
     3287                omf.libhdr.cDictBlocks = 0;
     3288                omf.libhdr.fchFlags = 0;
     3289               
     3290                #else
     3291                /* Write object file header. */
     3292                /* todo: link386 doesn't like if there are too many alias in one module btw. */
     3293                int cch = strlen("wk.obj");
     3294                omf.hdr.chType = THEADR;
     3295                omf.hdr.cb = cch + 2;           /* name + crc */
     3296                omf.ach[0] = cch;           /* module name */
     3297                memcpy(&omf.ach[1], "wk.obj", cch);
     3298                omf.ach[1+cch] = 0;         /* crc */
     3299                #endif
     3300                fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile);
     3301
     3302
     3303                /* Make aliases  */
     3304                offAlias = ftell(phFile);       /* save this to see if anything is added. */
     3305                param.phFile = phFile;
     3306                param.cAliases = 0;
     3307                rc = symEnum(pWld, &pWld->Global,
     3308                             WLDSF_WEAK, WLDSF_WEAK | WLDSF_WEAKALIASDONE,
     3309                             wldGenerateObjEnum, &param);
     3310                if (!rc)
     3311                {
     3312                    if (ftell(phFile) != offAlias)
     3313                    {
     3314                        #ifdef GENERATE_LIBRARY
     3315                        /* end the last object? */
     3316                        if (param.cAliases )
     3317                        {   
     3318                            off_t   off;
     3319                            omf.hdr.chType = MODEND;
     3320                            omf.hdr.cb = 2;                 
     3321                            memset(&omf.ach[0], 0, sizeof(omf.ach));
     3322                            off = (ftell(phFile) + omf.hdr.cb + sizeof(OMFREC)) % 32;
     3323                            if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC) + (off ? 32 - off : 0), 1, phFile) != 1)
     3324                            {
     3325                                wldErr(pWld, "Error occured while writing weak aliases. (2)");
     3326                                return -1;
     3327                            }
     3328                        }
     3329
     3330                        /* write end of library */
     3331                        memset(&omf, 0, sizeof(omf));
     3332                        omf.hdr.chType = LIBEND;
     3333                        omf.hdr.cb = 32 - 3;
     3334                        #else
     3335                        /* write end of module */
     3336                        omf.hdr.chType = MODEND;
     3337                        omf.hdr.cb = 2;
     3338                        omf.ach[0] = omf.ach[1] = 0;
     3339                        #endif
     3340                        if (fwrite(&omf, omf.hdr.cb + sizeof(OMFREC), 1, phFile) != 1)
     3341                        {
     3342                            wldErr(pWld, "Failed to write to '%s'.", pszObjName);
     3343                            rc = -1;
     3344                        }
     3345                        fclose(phFile);
     3346                    }
     3347                    else
     3348                    {
     3349                        WLDINFO(pWld, ("No weak alias needed, deleting file."));
     3350                        fclose(phFile);
     3351                        remove(pszObjName);
     3352                        *pszObjName = '\0';
     3353                    }
     3354                }
     3355                else
     3356                    fclose(phFile);
     3357            }
     3358            else
     3359            {
     3360                wldErr(pWld, "Failed to open '%s' for writing.", pszObjName);
     3361                *pszObjName = '\0';
     3362            }
     3363        }
     3364        else
     3365            wldErr(pWld, "Failed to generate temporary object file for weak aliases.");
     3366    }
     3367
     3368    /* cleanup */
    32733369    if (rc && pszObjName && *pszObjName)
    32743370    {
Note: See TracChangeset for help on using the changeset viewer.