2011-01-06 16 views
2

Dies ist ein kleines bisschen seltsam Problem hier.Dynamische Binärdatei aus Datei

Angenommen, ich habe einen C++ - Code, der auf einer bestimmten Plattform ausgeführt wird. Der einzige Zweck dieses Codes besteht darin, Dateien mit dem Binärcode NATIVE auf dieser Plattform auszuführen.

Jetzt - meine Frage ist - WIE würde ich die Daten aus diesen Dateien (könnte sogar durch Bits, wie 1024 Bits ein Zyklus) in den Speicher der Maschine mit meinem Code, so dass diese Daten in der Ausführung sein würde ?

Mit anderen Worten, kann ich die Daten an eine Stelle bringen, wo ich den Befehlszeiger zeigen kann?

Wenn ja, wie?

Ich habe nichts dagegen, wenn ich Assembler dafür verwenden muss - nur so würde es funktionieren.

EDIT: Sorry, ich war nicht spezifisch genug.

Grundsätzlich - die Dateidaten, die ich laden möchte, ist in keinem Format wie .exe, Mach-O ausführbare oder ELF. Es ist nur rohe Binärdaten (mit einigen benutzerdefinierte Header, die mein Code entfernt). Diese Binärdaten sind Maschinencode, spezifisch und für den Prozessor geeignet, der auf der aktuellen Maschine läuft.

Technisch bedeutet das, dass ich normale OS-Executoren umgehen und die Binärdatei direkt laden möchte. Ich könnte es interpretieren, aber das wäre höchstens 3x langsamer.

Ich hätte überhaupt nichts dagegen, wenn ich die Daten in einem anderen Child-Prozess ausführen müsste - aber wieder kann ich normale Prozessöffner nicht verwenden, weil die Daten nicht in einem Format sind, das das Betriebssystem automatisch ausführen könnte. wie .exe, Mach-O, ELF).

+0

Wenn Sie mit Run meinen, führen Sie eine andere Binärdatei aus, was ist falsch mit 'fork()' und 'system()'? – Nim

+0

Sie sagen nichts über Ihr Ziel, und dies ist sehr zielabhängig. – AProgrammer

+0

Wo in der Welt erhalten Sie binäre Chunks zur Ausführung, ohne Sprache oder Plattform? – Mordachai

Antwort

4

Sie sollten nur Datei in dem Speicher lesen, diese Speicher als ausführbar markieren (es ist plattformspezifisch, beispielsweise VirtualProtect() für Windows), und nennen es als Funktion: ((void(*)())ptr)();

Natürlich Code in der Datei position-independent sein sollte.

+1

Ich würde erwarten, dass dies funktioniert, außer dass Sie die Rückkehr von diesem Codeblock einrichten müssen. Vermutlich haben Ihre binären Chunks, die Sie selbst ausführen, keine Stack-Setup/Abbau-Konventionen - nur einen Sprung in ihren Code zu erwarten. Das obige und das Hinzufügen des Rückgabe-Funktionscodes, der für die aktuelle Plattform geeignet ist, können also durchaus ausreichen. – Mordachai

+0

Um Mordachai's Kommentar zu erweitern: Wenn die ausführbaren Bits in der geladenen Datei "aussehen" C-Funktionen, dann wird Abyx Vorschlag funktionieren; 'dlsym' _et al._ arbeiten so. Wenn es sich um "rohe" Chunks handelt, die "nur einen Sprung in ihren Code erwarten", können Sie möglicherweise einen benutzerdefinierten 'jmp_buf' konstruieren und C's longjmp()' verwenden. –

+0

@Mordachai, JCSalomon - ja, ich verstehe das - die binären Chunks sind bereit für diese Art des Ladens, und sind nicht nur aus dem Zusammenhang gerissen. Auch - Abyx - könnten Sie mit der Ausführungsmarkierung für größere Plattformen genauer sein? Es scheint, dass diese OS-spezifischen Funktionen genau das sind, was ich wirklich brauche. –

0

Wie generisch muss Ihre Lösung sein?

Der OS Loader weiß normalerweise, wie bestimmte Dateiformate verarbeitet und in den Speicher geladen werden. Sie können normalerweise den OS Loader verwenden und den Einstiegspunkt aufrufen, aber dafür müssen Sie wissen, was der Einstiegspunkt ist und dafür müssen Sie das Dateiformat trotzdem verstehen. Ich kann mir dafür keine tragbare Lösung vorstellen.

Wenn Sie mehr darüber erklären, was Sie tun möchten, ist es vielleicht möglich, eine Lösung zu liefern.