diff options
Diffstat (limited to 'src/buildvm_peobj.c')
-rw-r--r-- | src/buildvm_peobj.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/src/buildvm_peobj.c b/src/buildvm_peobj.c index 1a8661bf..a24ae727 100644 --- a/src/buildvm_peobj.c +++ b/src/buildvm_peobj.c | |||
@@ -85,6 +85,7 @@ typedef struct PEsymaux { | |||
85 | #define PEOBJ_RELOC_REL32 0x14 /* MS: REL32, GNU: DISP32. */ | 85 | #define PEOBJ_RELOC_REL32 0x14 /* MS: REL32, GNU: DISP32. */ |
86 | #define PEOBJ_RELOC_DIR32 0x06 | 86 | #define PEOBJ_RELOC_DIR32 0x06 |
87 | #define PEOBJ_SYM_PREFIX "_" | 87 | #define PEOBJ_SYM_PREFIX "_" |
88 | #define PEOBJ_SYMF_PREFIX "@" | ||
88 | #elif LJ_TARGET_X64 | 89 | #elif LJ_TARGET_X64 |
89 | #define PEOBJ_ARCH_TARGET 0x8664 | 90 | #define PEOBJ_ARCH_TARGET 0x8664 |
90 | #define PEOBJ_RELOC_REL32 0x04 /* MS: REL32, GNU: DISP32. */ | 91 | #define PEOBJ_RELOC_REL32 0x04 /* MS: REL32, GNU: DISP32. */ |
@@ -260,7 +261,18 @@ void emit_peobj(BuildCtx *ctx) | |||
260 | 261 | ||
261 | emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_TEXT); | 262 | emit_peobj_sym_sect(ctx, pesect, PEOBJ_SECT_TEXT); |
262 | for (i = 0; ctx->extnames[i]; i++) { | 263 | for (i = 0; ctx->extnames[i]; i++) { |
263 | sprintf(name, PEOBJ_SYM_PREFIX "%s", ctx->extnames[i]); | 264 | const char *sym = ctx->extnames[i]; |
265 | const char *p = strchr(sym, '@'); | ||
266 | if (p) { | ||
267 | #ifdef PEOBJ_SYMF_PREFIX | ||
268 | sprintf(name, PEOBJ_SYMF_PREFIX "%s", sym); | ||
269 | #else | ||
270 | strncpy(name, sym, p-sym); | ||
271 | name[p-sym] = '\0'; | ||
272 | #endif | ||
273 | } else { | ||
274 | sprintf(name, PEOBJ_SYM_PREFIX "%s", sym); | ||
275 | } | ||
264 | emit_peobj_sym(ctx, name, 0, | 276 | emit_peobj_sym(ctx, name, 0, |
265 | PEOBJ_SECT_UNDEF, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN); | 277 | PEOBJ_SECT_UNDEF, PEOBJ_TYPE_FUNC, PEOBJ_SCL_EXTERN); |
266 | } | 278 | } |