Forum: Compiler & IDEs Linker script und startup code für Win32 Anwendung


von Nasen B. (nasenbaer_2013)


Lesenswert?

Hi,

ich tippsle gerade an einem kleinen heimprojekt.

Es geht um ein Betriebssystem auf der PC hardware.

Dabei gibt es zwei make targets.
Eines für ELF und das Andere für den Unittest/Code Coverage PE win32.

Aktuell läuft das Unittest Target ohne Startupcode,
und beginnt direkt in der int main(void) funktion.
Das würde ich jetzt gerne ändern.

Wie muss denn das Linkerscript für eine Win32 Consoleanwendung 
ausschauen ??
Wäre schön wenn da jemand gute Beispiele hätte.

Grüße
Nasenbaer

von Rolf Magnus (Gast)


Lesenswert?

Alexander Kiebler schrieb:
> Wie muss denn das Linkerscript für eine Win32 Consoleanwendung
> ausschauen ??

War denn bei deinem Compiler keins dabei?

von Dr. Sommer (Gast)


Lesenswert?

Nasen Baer schrieb:
> Es geht um ein Betriebssystem auf der PC hardware.
>
> Dabei gibt es zwei make targets.
> Eines für ELF und das Andere für den Unittest/Code Coverage PE win32.
Was denn jetzt, eigenes Betriebssystem oder Win32?!

von Nasen B. (nasenbaer_2013)


Lesenswert?

Hi Rolf,

Ich bin mit dem Compiler gerade etwas in der Schwebe.
Ich hab mir einen Crosscompiler als binärpakte heruntergeladen,
bin aber gerade auf dem Weg mir einen eigenen ELF compiler für
den PC zu bauen. Momentan arbeite ich aber noch mit dem Gezogenen.

Also das exe target ist minGw
Das andere ist der ELF crosscompiler.

Mein LInkerscript für das Unittest Target habe ich jetzt vereinfacht 
durch:

ENTRY(_start)

Mein Startup code:

// Declare functions which are in other translation units
.extern init


// Text Section
.section .text
.global _start

_start:

    // call c_tors
    call _v_iniCtors

    // C-Code aufrufen
    call _init

    call _main

_stop:
    cli
    hlt

Leider schein da irgendwas mit dem namemangling nicht zu stimmen.
Er Meckert... "undefined reference to main"
nm main.o:
00000000 b .bss
00000000 d .data
00000000 r .eh_frame
00000000 r .rdata$zzz
00000000 t .text
00000000 T __Z5_mainv
nm start.o:
00000000 b .bss
00000000 d .data
00000000 t .text
         U _init
         U _main
00000000 T _start
0000000f t _stop
         U _v_iniCtors

Na ja wenn ich linker wäre würde ich das auch sagen =)....

von Nasen B. (nasenbaer_2013)


Lesenswert?

Hi Dr. Sommer,

es gibt ein Target welches mit dem Crosscompiler
gebaut wird.
Das wird dann von GRUB direkt geladen und ich muss neustarten.

Dann gibt es ein zweites makefile Target.
Dort linke ich gegen gcov und ev. ne CPPTest oder so.
Das wird ein PE Format und läuft als Win32 Anwendung auf Windows.
Dort werde ich mit Tests dagegenprogrammieren.

Der embedded Teil läuft.
Momentan sind es wohl zwei Probleme.
Das eine ist das das Namemangling nicht stimmt. Ev def file ??
Das zweite ist (vor zwei Tagen) habe ich für eine normale Win32 
Anwendung ein Linkerscript zum bauen benutzt.
Compilieren und Linken war gut(Fehlerlos). Aber beim Ausführen auf 
Windows habe ich
"Keine valide Win32 Anwendung" zurückbekommen. ....
Und aus dem Grund habe ich hier ins Forum Geschrieben. Also das zweite 
Problem interessiert mich.

von Dr. Sommer (Gast)


Lesenswert?

Ob du's glaubst oder nicht, es gibt fertige Compiler für Win32. 
Installier dir so einen und compiliere damit einfach direkt für Windows. 
z.B. MSVC, mingw32, mingw64, ... Da brauchst du gar nichts mit 
linkerscripten rumzufummeln.

von Nasen B. (nasenbaer_2013)


Lesenswert?

Okay, also jetzt bin ich beim besagten Problem.

ich habe einfach

call __Z5_mainv

anstatt

call _main

verwendet.

Wenn ich das executable jetzt aufrufe, dann
bekomme ich:


*.exe ist keine zulässige Win32-Anwendung...

von Nasen B. (nasenbaer_2013)


Lesenswert?

Hi  Dr. Sommer

klar gibt es das. Aber ich habe jetzt eben bock drauf.
Ich freu mich über hilfe,... aber was ich  zu hause mache...
bitte mein bier sei lassen =)....

Nichts für ungut...

von Dr. Sommer (Gast)


Lesenswert?

Nasen Baer schrieb:
> klar gibt es das. Aber ich habe jetzt eben bock drauf.
Dann bist du selber schuld :P

Schau dir die produzierte .exe mal im Hexeditor an und vergleiche mit 
der Spezifikation für das PE-Format...

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.