os programmierung mit g++ und den binutils
-
folgendes hab ich bisher herausgefunden:
- man compiliere erst zu einer objekt datei:
"g++ -I. start.cpp -c -o start.o -nostdlib -nostdinc -nostdinc++ -fno-builtin -fno-exceptions -ffreestanding -O0 -fno-inline -fno-default-inline -fno-rtti -Wall"
sollte man hier noch etwas hinzufügen? mir stehen dann vererbung, überladen von funktionen wie operatoren und auch konstruktoren und desctruktoren aber kein new/delete, keine exceptions und keine funktionen/klassen der stdlib zur verfügung. was noch alles nicht?- dann wird bin mit ld gelinkt:
"ld --entry _Z5startv -o setup --oformat binary -Ttext 0x0008000 start.o"
reicht das?jetz hab ich noch ein paar fragen:
- soweit ich weiß verwendet der g++ den stack für lokale variablen. wo im speicher ist der stack? und wie kann ich das konfigurieren, wenn das nötig ist?#include <iostream> using namespace std; int main(void) { unsigned long blabla; cout << (void*)&blabla << endl; return 0; }
bei diesem code gibt er mir "0xbffff394" aus. dh heißt er greift auf eine sehr hohe adresse zu. wenn kein paging eingeschaltet ist, muss das dann im prinzip die physikalische adresse sein (wenn die base im segment descriptor auch noch != 0 ist, dann wäre das noch mehr). nachdem aber kaum ein rechner so viel ram hat, muss ich dem g++ beibringen, dass er die variablen irgendwo weiter unten erstellt. wie könnte das klappen? ich denke, die lösung liegt bei ebp und esp, aber ich weiß nicht genau, was der g++ mit diesen beiden registern anstellt....
- der g++ ist für den flat mode gedacht oder? kann ich jetz nur programme ausführen, wenn ich auch den flat mode verwende? was ist, wenn ich segmentieurng verwenden will?
- dynamischer speicher: ich denk das is keine frage des g++ sondern der stdlib. aber vielleicht hat trotzdem jemand informationen wie man so was implementiert.
- welche teile, die man nicht verwenden kann, könnte man am einfachsten mit assembler nachprogrammieren?
danke fürs durchlesen.