Autor Thema: Externe functionen aufrufen  (Gelesen 6331 mal)

Shining

  • Beiträge: 17
    • Profil anzeigen
Gespeichert
« am: 07. May 2004, 20:49 »
Also, nehmen wir an, ich habe eine andere asm file zur .obj compiliert.
in der obj datei sind Functionen, die der Kernel aufrufen soll, wie stelle ich dies nun an?
reicht es in der file global _machdiesunddas zu schreiben und die dann im kernel mit call _machdiesunddas aufzurufen?
Oder was muss ich machen? sry, muss mir mal ein gutes buch kaufen :) kann mir einer eins empfehlen? *löel*

mfg Shining

Shining

  • Beiträge: 17
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 07. May 2004, 20:50 »
Mist, edit geht nicht ... hab vergessen, die obj file ist natürlich zum kernel gelinkt ;)

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #2 am: 07. May 2004, 22:57 »
Ja es genügt.

Wenn du aber die Funktion in C aufrufst, dann musst du im C-Code den "_" vor der Funktion weglassen. C fügt den beim compilen automatisch hinzu.
----------------------
Redakteur bei LowLevel

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #3 am: 07. May 2004, 23:07 »
Aber es geht doch auch, wenn man sowohl in C als auch im Assembler den _ weglässt! Also irgendwie verstehe ich das alles nicht mit diesen Unterstrichen. Kann einer mal ne Übersicht geben, wann wie welcher Compiler/Assembler wo einen unterstrich setzt? (Aufruf/Dekleration)?

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #4 am: 08. May 2004, 00:39 »
Beim Compilen von C-Code wird vom Compiler ein "_" vor jede Funktion gehängt.

Angenommen ich habe also die Funktion :
void main();

Wenn ich diese von Asm aus aufrufen möchte, dann schreibe ich:
call _main;

Und wenn ich nun in ASM eine Funktion erstellen will die ich auch von C aus aufrufen kann, dann muss ich ein "_" vor den Funktionsnamen schreiben:

_Function:


Und diese Funktion global setzen mit:

global _Function

In C rufe ich die Funktion dann mit:

Funktion();

auf.
----------------------
Redakteur bei LowLevel

Shining

  • Beiträge: 17
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 08. May 2004, 06:58 »
gibt es auch eine möglichkeit diese difinierte function von anderen programmen aus zu steuern? ohne das sie mitgelinkt werden?
Also ohne sie jetzt an einen Interrupt zu koppeln

chr15

  • Beiträge: 279
    • Profil anzeigen
    • http://www.clinux.de.vu
Gespeichert
« Antwort #6 am: 08. May 2004, 10:16 »
Bei mir kann ich void meine_funktion() auch aufrufen, wenn im Assembler nur
global meine_funktion
meine_funktion:
steht. Was ist das????

TeeJay

  • Beiträge: 630
    • Profil anzeigen
    • http://www.jay-code.de
Gespeichert
« Antwort #7 am: 08. May 2004, 11:23 »
ka
möglich das der Compiler das dann noch so ändert.
----------------------
Redakteur bei LowLevel

Another Stupid Coder

  • Beiträge: 749
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 08. May 2004, 11:43 »
Bei meiner gcc version (gcc version 3.3 20030226 (prerelease) (SuSE Linux)) von SuSE 8.2 und auch bei meinem ehemaligen SuSE 9.0 funzt es auch ohne '_'

Shining

  • Beiträge: 17
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 08. May 2004, 12:12 »
Bei mir entstehen aber auch immer probs ^^
Ich hab die obj files erstellt und wollte diese nun linken, nur das prob ist, das die adresse 0x200 in der linkfile bei mir net hinhaut, weis einer, wie ich die richtige herausfinde? 1000 isses nicht, soviel weis ich ^^

mfg Shining

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #10 am: 08. May 2004, 12:56 »
beziehst du dich auf das Beispiel von TeeJay? Wenn ja liegt es daran wie gross der 16-BIT Plain Binary Code. der 32-BIT Code fängt ja genau hinter der Datei an also wenn die bin 512 Bytes gross ist dann beginnt der 32-BIT Kernel ab offset 512 (0x200), deshalb werden die Nullbytes hinten drangehangen um ne genaue grösse zu erhalten.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

kleiner

  • Beiträge: 131
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 08. May 2004, 13:08 »
Also, Du kannst Funktionen aus anderen Programmen nicht normal nutzen. Um das zu erreichen könntest Du z.B. ELF verwenden, und damit die entsprechenden Verbindungen aufbaun und die Funktion die Du so nutzen willst in eine shared library packen. Aber ELF musst Du halt selbst umsetzen und das bedeutet einiges an Arbeit. Der Linuxkernel lädt seine Module z.B. über ELF.

Shining

  • Beiträge: 17
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 08. May 2004, 22:16 »
Jain, ich hab die Linkfile aus dem beispiel, jedoch alles in assembler erstellt. Alles zusammen will ich zu dem normalen Kernel linken. Also wenn ich das recht verstehe (ist ja alles 16 bit code) müsste die adresse 0 sein? ist ja in dem sinne der anfang ...

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #13 am: 08. May 2004, 22:49 »
Weiss nich genau was du meinst.

Kernel16.bin ist die PlainBinary und liegt als erstes im Speicher, die wird jetz genau auf 512 Bytes vergrössert.

So dahinter liegt jetz kernel32.obj und ckernel.obj zusammengelinkt, aber nur wenn du eine Datei hast wo zuerst die kernel16.bin und direkt folgend kernel32.obj und ckernel.obj steht.

Im Linker Skript sagst du dem Linker halt das kernel32.obj und ckernel.obj ab offset 0x0200 beginnt, das kann natürlich bei dir völlig anders sein vielleicht weil die kernel16.bin grösser als 512 Bytes ist, oder du vielleicht die Dateien so zusammenkopiert hast das kernel32.obj und ckernel.obj nicht genau hinter kernel16.bin stehen

Hoffe ich konnt dir helfen ansonsten kannst du dich ja mal per icq oder mail bei mir melden
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

Shining

  • Beiträge: 17
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 08. May 2004, 22:54 »
naja das ding ist, ich hab kein ckernel, wie im tut, ich hab den reinen asm kernel und ein paar obj files (memory, system, string etc...) die ich dazu linken möchte, nur funktioniert es nicht so ganz.

lobmann

  • Beiträge: 243
    • Profil anzeigen
    • http://www.fallek.de.vu
Gespeichert
« Antwort #15 am: 08. May 2004, 23:05 »
Ich glaub ich weiss jetz was du meinst das Problem hast du glaub ich mit den _Unterstrichen. Die Unterstriche brauchst du nur wenn du asm funktionen in C aufrufen willst. Weil der C-Compiler jeder Funktion im C-Quelltext ein Unterstrich voranstellt, und wenn der Linker jetz sich die Funktionen zusammensucht findet der die Assembler Funktionen nur wenn ein Unterstrich vorransteht.

Also was eigentlich sagen will der ASM-Compiler macht das halt nich da musst du dann jede Funktion mit dem selben Namen aufrufen wie sie in einem anderen Modul definiert ist.
Man kann doch nem alten Mann nicht in den Bart spucken und sagen es hat geschneit

 

Einloggen