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?
davy.ai
Para compilar la función como una función
C++
y vincularla a ensamblador, puedes usar la declaraciónextern "C++"
en el archivoKernel.cpp
. Modifica el código enKernel.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.