Changeset 540
- Timestamp:
- Aug 6, 2003, 3:07:18 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/emx/src/emxomf/weakld.c
-
Property cvs2svn:cvs-rev
changed from
1.15
to1.16
r539 r540 119 119 } OMFLIBHDR, *POMFLIBHDR; 120 120 #pragma pack() 121 122 /** OMF library header - for combining with OMFREC. */ 123 #pragma pack(1) 124 typedef struct OMFLIBHDRX 125 { 126 unsigned long offDict; 127 unsigned short cDictBlocks; 128 unsigned char fchFlags; 129 } OMFLIBHDRX, *POMFLIBHDRX; 130 #pragma pack() 131 121 132 /** @} */ 122 133 … … 226 237 WLDSF_EXPORT = 0x1000, 227 238 239 /** Internal flag to say that we've already aliased this weak 240 * in the definition file. 241 */ 242 WLDSF_WEAKALIASDONE = 0x8000, 228 243 } fFlags; 229 244 … … 2879 2894 2880 2895 2896 typedef 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 2881 2906 /** 2882 2907 * Symbol enumeration callback function of wld_generate_weakobj(). … … 2889 2914 * @param pvUser Pointer to a FILE stream. 2890 2915 */ 2891 static int w eakobjEnum(PWLD pWld, PWLDSYM pSym, void *pvUser)2916 static int wldGenerateObjEnum(PWLD pWld, PWLDSYM pSym, void *pvUser) 2892 2917 { 2893 2918 if (pSym->pszWeakName) 2894 2919 { 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); 2899 2934 2900 2935 WLDINFO(pWld, ("using weak %s for %s", pSym->pszWeakName, pSym->pszName)); … … 2912 2947 } 2913 2948 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)"); 2920 2993 return -1; 2921 2994 } 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++; 2953 2996 } 2954 2997 return 0; … … 2956 2999 2957 3000 2958 /** Parameter structure for wld defCallback (module definition parser callback). */2959 typedef struct wld defCallback_param3001 /** Parameter structure for wldGenerateDefCallback (module definition parser callback). */ 3002 typedef struct wldGenerateDefCallback_param 2960 3003 { 2961 3004 /** Linker Instance. */ … … 2967 3010 /** Our current linenumber index. */ 2968 3011 unsigned iLine; 2969 } WLD DCPARAM, *PWLDDCPARAM;3012 } WLDGDCPARAM, *PWLDGDCPARAM; 2970 3013 2971 3014 /** … … 2977 3020 * @param pStmt Statement we're processing. 2978 3021 * @param eToken Token we're processing. 2979 * @param pvArg Pointer to a WLD DCPARAM structure.3022 * @param pvArg Pointer to a WLDGDCPARAM structure. 2980 3023 * @sketch 2981 3024 * … … 2990 3033 * copied to the new file. 2991 3034 */ 2992 static int wld defCallback(struct _md *pMD, const _md_stmt *pStmt, _md_token eToken, void *pvArg)2993 { 2994 PWLD DCPARAM pParam = (PWLDDCPARAM)pvArg;3035 static int wldGenerateDefCallback(struct _md *pMD, const _md_stmt *pStmt, _md_token eToken, void *pvArg) 3036 { 3037 PWLDGDCPARAM pParam = (PWLDGDCPARAM)pvArg; 2995 3038 2996 3039 switch (eToken) … … 3038 3081 cch = sprintf(szTmp, " \"%s\" = \"%s\"", pStmt->export.entryname, pSymInt->pszWeakName); 3039 3082 else 3083 { 3040 3084 cch = sprintf(szTmp, " \"%s\" = \"%s\"", pStmt->export.entryname, pSymExp->pszWeakName); 3085 pSymExp->fFlags |= WLDSF_WEAKALIASDONE; 3086 } 3041 3087 if (pStmt->export.flags & _MDEP_ORDINAL) 3042 3088 cch += sprintf(&szTmp[cch], " @%d", pStmt->export.ordinal); … … 3131 3177 3132 3178 /* zero returns */ 3133 *pszObjName = '\0'; 3179 if (pszObjName) 3180 *pszObjName = '\0'; 3134 3181 if (pszDefName) 3135 3182 *pszDefName = '\0'; 3136 3183 3137 3184 /* 3138 * Generate the object file3185 * Do the definition file. 3139 3186 */ 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) 3214 3188 { 3215 3189 rc = wldTempFile(pWld, pszDefName, "wk", ".def"); … … 3230 3204 if (pMD) 3231 3205 { 3232 WLD DCPARAM param;3206 WLDGDCPARAM param; 3233 3207 param.pWld = pWld; 3234 3208 param.phOrgFile = phOrgFile; … … 3238 3212 /* parse it */ 3239 3213 _md_next_token(pMD); 3240 rc = _md_parse(pMD, wld defCallback, ¶m);3214 rc = _md_parse(pMD, wldGenerateDefCallback, ¶m); 3241 3215 _md_close(pMD); 3242 3216 … … 3262 3236 } 3263 3237 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."); 3265 3239 } 3266 3240 … … 3271 3245 *pszDefName = '\0'; 3272 3246 } 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, ¶m); 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 */ 3273 3369 if (rc && pszObjName && *pszObjName) 3274 3370 { -
Property cvs2svn:cvs-rev
changed from
Note:
See TracChangeset
for help on using the changeset viewer.