[SPEC2DEF] Fix decorated exports on non-x86
authorTimo Kreuzer <timo.kreuzer@reactos.org>
Thu, 29 Aug 2019 16:16:06 +0000 (18:16 +0200)
committerTimo Kreuzer <timo.kreuzer@reactos.org>
Sun, 15 Sep 2019 12:12:42 +0000 (14:12 +0200)
sdk/tools/spec2def/spec2def.c

index c7dba2c..926cb32 100644 (file)
@@ -448,8 +448,21 @@ OutputLine_asmstub(FILE *fileDest, EXPORT *pexp)
     }
     else if (giArch != ARCH_X86)
     {
-        sprintf(szNameBuffer, "_stub_%.*s",
-                pexp->strName.len, pexp->strName.buf);
+        /* Does the string already have stdcall decoration? */
+        const char *pcAt = ScanToken(pexp->strName.buf, '@');
+        if (pcAt && (pcAt < (pexp->strName.buf + pexp->strName.len)) && 
+            (pexp->strName.buf[0] == '_'))
+        {
+            /* Skip leading underscore and remove trailing decoration */
+            sprintf(szNameBuffer, "_stub_%.*s",
+                    (int)(pcAt - pexp->strName.buf - 1),
+                    pexp->strName.buf + 1);
+        }
+        else
+        {
+            sprintf(szNameBuffer, "_stub_%.*s",
+                    pexp->strName.len, pexp->strName.buf);
+        }
     }
     else if (pexp->nCallingConvention == CC_STDCALL)
     {
@@ -670,7 +683,9 @@ OutputLine_def_GCC(FILE *fileDest, EXPORT *pexp)
         {
             /* Is the name in the spec file decorated? */
             const char* pcDeco = ScanToken(pexp->strName.buf, '@');
-            if (pcDeco && (pcDeco < pexp->strName.buf + pexp->strName.len))
+            if (pcDeco && 
+                (pexp->strName.len > 1) &&
+                (pcDeco < pexp->strName.buf + pexp->strName.len))
             {
                 /* Write the name including the leading @  */
                 fprintf(fileDest, "==%.*s", pexp->strName.len, pexp->strName.buf);