Forum: Compiler & IDEs Aus Startup-Code C++ Funktion aufrufen (ARM)


von Günther (Gast)


Lesenswert?

Hallo,
ich habe in meinem Startup-Code (LPC2000) ein Problem. Und zwar möchte 
ich, bevor ich main aufrufe, eine andere Funtion starten, die 
dummerweise in C++ realisiert ist.
Im Startupcode gibts ja die Anweisungen

  ldr r12, =main
  mov lr, pc
  bx r12

nun möchte ich, bevor ich main aufrufe, eine andere Funktion starten 
namens init. Wenn ich folgendes schreibe:


  ldr r12, =init
  mov lr, pc
  bx r12

dann funktioniert dies zwar, völlig zuverlässig, aber nur, wenn init 
eine C-Funktion ist. Sobald ich init in einem cpp-File habe (und das 
habe ich, weil init auf bestimmte C++ Klassen zugreifen muss), dann 
meckert der Compiler (undefinied symbol).

Was  muss ich tun, damit er erkennt, was init ist? In C geht das ja 
auch.


Gruss

von (prx) A. K. (prx)


Lesenswert?

Rauskriegen wie die Funktion heisst und diese aufrufen. Eine C++ 
Funktion void init() heisst auf Assembler-Ebene nicht einfach nur init, 
weil Parametertypen in den Namen reincodiert sind.

Alternativ: Diese Funktion mit extern "C" garnieren.

von Günther (Gast)


Lesenswert?

A.K.,
danke erstmal.
Wie finde ich den Namen der Funktion denn raus?
Und, wenn ich sie mit extern "C" garniere - kann sie dann dennoch C++ 
Code ausführen?

von (prx) A. K. (prx)


Lesenswert?

Name: beispielsweise ins Mapfile reinsehen.
Kann dennoch C++ ausführen.

von Günther (Gast)


Lesenswert?

Vielen Dank AK, funktioniert bestens!

von Interessierte (Gast)


Lesenswert?

@guenther

Für Interessierte :)

Wie musstest du die Funktion denn nun aufrufen?

von Stefan E. (sternst)


Lesenswert?

Interessierte schrieb:
> @guenther
>
> Für Interessierte :)
>
> Wie musstest du die Funktion denn nun aufrufen?

Na genau so, wie im ersten Post. Er hat mit dem 'extern "C"' nur dafür 
gesorgt, dass die Funktion auch tatsächlich "init" heißt.

von Günther (Gast)


Lesenswert?

Ja, genau so habe ich es gemacht.
Mein Startup-Code lädt erst die Adresse der init-Funktion, so:

   ldr r12, =init
   mov lr, pc
   bx r12

und dann erst wird main gestartet:

   ldr r12, =main
   mov lr, pc
   bx r12

wobei die funktion init so aussieht:

extern "C" void init(void)
{
...
}

Gruss

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

und ohne das extern "C" heißt die Funktion dann (bei einem 3.4.4 x86 
gcc) __Z4initv. Stichwort "Name mangling".

Matthias

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.