summaryrefslogtreecommitdiff
path: root/src/buildvm_peobj.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/buildvm_peobj.c')
-rw-r--r--src/buildvm_peobj.c14
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 }