la vinculación de montaje y problema c
-
19-09-2019 - |
Pregunta
Tratar de entender cómo vincular una función que se define en una estructura, la función está en el código ensamblador, y estoy tratando de llamarlo desde c. Creo que estoy perdiendo una causa paso cuando llamo a la función, aparece un símbolo externo sin resolver ...
;Assembly.asm
.686p
.mmx
.xmm
.model flat
include Definitions.inc
.code
?Initialize@Foo@@SIXPAUFee@@@Z proc
jmp $
?Initialize@Foo@@SIXPAUFee@@@Z endp
end
//CFile.c
struct Fee
{
signed long id;
}
struct Foo
{
static void Initialize(Fee *);
}
int startup(Fee * init)
{
Foo::Initialize(init); //<-- This is unresolved
return 0;
}
Solución
Su código de montaje define una función cuyo nombre decorado decodifica a
public: static void __fastcall Foo::InitializeCurrentCpu(struct Fee *)
Como obtenida a través de la utilidad undname.exe. Foo :: InitializeCurrentCpu () no estará a la altura de Foo :: Initialize (), el nombre no coincide. Tampoco la convención de llamada.
Escribir el código en C ++ primero y mirar el archivo .map para el nombre decorado correcta. O declarar la función con extern "C" para suprimir la decoración C ++.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow