Ich würde gerne wissen, ob ich ein Code-Stück ausführen kann, das sich im Heap-Bereich befindet.
linux
memory
dynamic-linking
Sen.
quelle
quelle
Antworten:
Könnte sein. Wenn der Heap ausführbar ist, können Sie zu diesem Code verzweigen. Einige Unix-Varianten machen den Heap-Speicher jedoch nicht ausführbar , um das Ausnutzen einiger Sicherheitslücken wie Pufferüberläufe zu erschweren (selbst wenn Sie Code in ein Programm einfügen können, können Sie möglicherweise nicht dorthin verzweigen). (Eine Beschreibung der Unix-Varianten und ihrer Konfiguration finden Sie im verlinkten Artikel.) Einige Prozessorarchitekturen verfügen außerdem über separate Caches für Code und Daten , sodass Sie möglicherweise eine Anweisung zum Leeren des Cache ausgeben müssen. Alles in allem ist dies nicht etwas, was Sie von Hand tun möchten.
Es gibt eine Standard-Unix-API zum Laden und Ausführen von Code, die alles tut, um den geladenen Code ausführbar zu machen: dlopen . Der Code muss aus einer Datei geladen werden.
Just-in-Time-Compiler versuchen normalerweise, schnellere Schnittstellen als dlopen zu finden. Sie müssen die stark plattformabhängigen Methoden zur Sicherstellung der Ausführbarkeit von Code verwalten.
EDIT: Danke an Bruce Ediger , der mich daran erinnert hat, dass der Cache geleert werden muss.
quelle
Auf einigen Hardwarekomponenten (wie den HP-PA-CPUs von HP) ist dies weitaus schwieriger, und auf anderen (wie der DEC Alpha-CPU) müssen Sie zuerst einen Befehls-Cache leeren, aber im Allgemeinen können Sie Code auf dem Heap ausführen. Das Folgende ist ein einigermaßen anständiges C-Sprachprogramm, das Code "auf dem Heap" ausführt.
quelle