Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

1

03.09.2014, 16:54

[Gelöst] ld.exe manuell benutzen

Ich versuche im Moment, C-Code und ASM-Code zusammenzuführen. Dafür verwende ich NASM und MinGW. Mein Problem ist momentan die ld.exe. Eigentlich sollte sie eine Datei namens "a.out" erstellen, es gibt aber nur eine "a.exe", die mir, egal was ich an ld.exe an Argumenten übergebe, die Meldung ausgibt, dass es eine nicht unterstützte 16-Bit Anwendung sei. Dabei will ich gar keine Exe, sondern nur die .bin Datei, damit ich mein OS damit machen kann.
Weis jemand von euch, wie man die ld.exe richtig bedient?

MfG,
RmbRT
"Dumm ist, wer dummes tut."

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »RmbRT« (04.09.2014, 14:57)


2

03.09.2014, 17:05

Du brauchst ein Cross-Tool oder du kannst den Befehl 'objcopy -O binary a.exe kernel.bin' benutzten, der dir eine rohe Datei kernel.bin erstellt (funktioniert bei mir jedenfalls, ich programmier grad nämlich auch ein OS :D)

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

3

03.09.2014, 17:18

Danke, bei mir kommt aber folgendes raus:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
00000000  1400              adc al,0x0
00000002  0000              add [bx+si],al
00000004  0000              add [bx+si],al
00000006  0000              add [bx+si],al
00000008  017A52            add [bp+si+0x52],di
0000000B  0001              add [bx+di],al
0000000D  7C08              jl 0x17
0000000F  011B              add [bp+di],bx
00000011  0C04              or al,0x4
00000013  0488              add al,0x88
00000015  0100              add [bx+si],ax
00000017  001C              add [si],bl
00000019  0000              add [bx+si],al
0000001B  001C              add [si],bl
0000001D  0000              add [bx+si],al
0000001F  0004              add [si],al
00000021  0000              add [bx+si],al
00000023  0013              add [bp+di],dl
00000025  0000              add [bx+si],al
00000027  0000              add [bx+si],al
00000029  41                inc cx
0000002A  0E                push cs
0000002B  08850242          or [di+0x4202],al
0000002F  0D054F            or ax,0x4f05
00000032  C50C              lds cx,[si]
00000034  0404              add al,0x4
00000036  0000              add [bx+si],al
00000038  1400              adc al,0x0
0000003A  0000              add [bx+si],al
0000003C  0000              add [bx+si],al
0000003E  0000              add [bx+si],al
00000040  017A52            add [bp+si+0x52],di
00000043  0001              add [bx+di],al
00000045  7C08              jl 0x4f
00000047  011B              add [bp+di],bx
00000049  0C04              or al,0x4
0000004B  0488              add al,0x88
0000004D  0100              add [bx+si],ax
0000004F  001C              add [si],bl
00000051  0000              add [bx+si],al
00000053  001C              add [si],bl
00000055  0000              add [bx+si],al
00000057  0004              add [si],al
00000059  0000              add [bx+si],al
0000005B  000D              add [di],cl
0000005D  0000              add [bx+si],al
0000005F  0000              add [bx+si],al
00000061  41                inc cx
00000062  0E                push cs
00000063  08850242          or [di+0x4202],al
00000067  0D0549            or ax,0x4905
0000006A  C50C              lds cx,[si]
0000006C  0404              add al,0x4
0000006E  0000              add [bx+si],al


mein programm:
main.c

C-/C++-Quelltext

1
2
3
4
5
6
7
extern int main();

int main()
{
    asm("hlt");
    return 0;
};

call.c

C-/C++-Quelltext

1
2
3
4
5
extern int main();
void test()
{
main();
}


MfG,
RmbRT
"Dumm ist, wer dummes tut."

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

4

03.09.2014, 17:21

Hier meine make.bat:

Quellcode

1
2
3
4
5
gcc -c src/main.c -o bin/main.o
gcc -c src/call.c -o bin/call.o

ld -r -s bin/main.o -r -s bin/call.o
objcopy -O binary a.exe kernel.bin


MfG,
RmbRT
"Dumm ist, wer dummes tut."

5

03.09.2014, 17:49

Du musst aber noch irgendwie den Einstiegspunkt definieren und du solltest auch Option -r nicht benutzen. Am besten benutzt du ein Linkerscript, damit du nicht alles in eine Befehlszeile tun musst:

Dieser Befehl nimmt die Datei 'kernel.ld' und wertet sie aus: 'ld -T kernel.ld'

Die Datei 'kernel.ld':

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
INPUT //die Objekt-Dateien
(
 bin/asmkernel.o //der Code, der vom Bootloader geladen wird und ggf. in den Protectedmode/Longmode schaltet und den C-Kernel aufruft
 bin/call.o
 bin/main.o
)

ENTRY(starte) //Start bei Symbol 'starte' (oder ein anderes )
SECTIONS
{
  .text 0x8000  : { *(.text) } //0x8000 gibt die Adresse an, an der dein Kernel vom Bootloader geladen wird (ändere diese, damit es zu deinem BL passt)
  .data     : { *(.data) }
  .bss      : { *(.bss)  }
  .rodata   :
    {
        *(.rdata)
        *(.rodata)
        *(.rdata$zzz)
        *(.eh_frame)
    }
}


Btw. machst du ein 16/32 oder 64 Bit OS?

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

6

03.09.2014, 18:47

Ich habe jetzt schon einiges probiert, aber es kommt immer unverhältnismäßig viel ASM code dabei raus. Gibt es keinen weg, wie man verhindert, dass eine .exe erstellt wird?
Edit: Anscheinend ist auch std mit dabei, wie lasse ich sowas weg?
@Roflo: ich bin mir noch nicht sicher, wahrscheinlich 32+64 bit.

MfG,
RmbRT
"Dumm ist, wer dummes tut."

7

03.09.2014, 19:08

Was linkst du denn noch dazu? Wenn du nur diese 3 Dateien linkst, sollte auch keine stdlib dabei sein. Füge dem Linker mal den Schalter -M dazu, um eine Map mit den Symbolen zu erhalten. Wenn du neben 'deinen' Symbolen noch viele andere findest, ist da sicher was faul. Wie schaut denn dein Assembler-Code aus?

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

8

03.09.2014, 19:32

Mal ein kleiner ausschnitt aus "ld bin/main.o bin/call.o -nostdlib -M":

Quellcode

1
2
3
4
5
6
7
8
9
                0x0000000000403728                VirtualProtect@16
                0x0000000000403730                EnterCriticalSection@4
                0x0000000000403738                TlsGetValue@4
                0x0000000000403740                GetLastError@0
                0x0000000000403748                LeaveCriticalSection@4
                0x0000000000403750                DeleteCriticalSection@4
                0x0000000000403758                InitializeCriticalSection@4
                0x0000000000403760                strdup
                0x0000000000403768                stricoll

Eigentlich will ich ja nur das C in asm umwandeln, ohne irgendwelche Abhängigkeiten zu verwenden.

MfG,
RmbRT
"Dumm ist, wer dummes tut."

Tobiking

1x Rätselkönig

  • Private Nachricht senden

9

03.09.2014, 19:52

Du könntest beim Kompilieren dem GCC noch -ffreestanding mitgeben, damit er gar nicht erst Code generiert, der auf die Standardbibliothek zugreift.

Die Abhängigkeiten sind allerdings recht Windows spezifisch. Ich weiß nicht ob die standard MingW Toolchain überhaupt in der Lage ist Code ohne Abhängigkeiten oder im a.out Format auszugeben. Meist wird für Windows Compiler nur der PE Support aktiviert.

RmbRT

Treue Seele

  • »RmbRT« ist der Autor dieses Themas

Beiträge: 169

Wohnort: Darmstadt

Beruf: Student

  • Private Nachricht senden

10

03.09.2014, 20:11

Und wie erstelle ich Windows unabhängigen code?

MfG,
RmbRT
"Dumm ist, wer dummes tut."

Werbeanzeige