es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Función C++ externa compilada en asm

Estoy siguiendo una serie de desarrollo de sistemas operativos por Poncho en YouTube. El sexto video vinculó C++ con código en ensamblador utilizando extern, pero el código se vinculó como código C ya que estaba escrito como extern "C" void _start().

En ExtendedProgram.asm, _start fue llamado de la siguiente manera:

[extern _start]
Start64bit:
    mov edi, 0xb8000
    mov rax, 0x1f201f201f201f20
    mov ecx, 500
    rep stosq
    call _start
    jmp $

En Kernel.cpp había:

“`c++
extern “C” void _start() {
return;
}


Uno de los comentarios en el video muestra que para `C++` se crea un nombre diferente, `_Z6_startv`. Así que para probarlo, modifiqué mi `Kernel.cpp` de la siguiente manera: ```c++ extern void _Z6_startv() { return; }

Y también modifiqué ExtendedProgram.asm reemplazando _start por _Z6_startv, pero el enlazador dio un error:

/usr/local/x8664elfgcc/bin/x8664-elf-ld: warning: cannot find entry symbol _start; defaulting to 0000000000008000

Entonces intenté lo siguiente en Kernel.cpp:

c++
extern "C++" void _Z6_startv() { return; }

Pero el enlazador volvió a dar un error. Intenté algunas otras combinaciones y métodos, todas terminando miserablemente, y finalmente terminé aquí en Stack Overflow.

Entonces, la pregunta es:

¿Cómo compilar la función como una función C++ y vincularla con ensamblador?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para compilar la función como una función C++ y vincularla a ensamblador, puedes usar la declaración extern "C++" en el archivo Kernel.cpp. Modifica el código en Kernel.cpp de la siguiente manera:
    c++
    extern "C++" void _Z6_startv() { return; }

    Luego, en el archivo ExtendedProgram.asm, reemplaza todas las apariciones de _start con _Z6_startv. Esto debería permitir que el enlazador vincule correctamente la función C++ al código ensamblador.

Comments are closed.