gcc - schreiben und Ausführen von Code in der bss - Setzen der Erlaubnis Flags

9

Ich erzeuge x86-64-Code zur Laufzeit in einem C-Programm auf einem Linux-System (Centos 5.4, um genau zu sein).

Ich erzeuge meine Bytecodes in einem globalen Array wie unten gezeigt

%Vor%

und rufe dann über einen Funktionszeiger hinein.

Mein Problem ist, wenn ich das Programm so kompiliere

%Vor%

Ich bekomme einen SIGSEGV, was ich vermute, liegt daran, dass der bss-Abschnitt nicht als ausführbar festgelegt ist, wie es von pmap

gezeigt wird %Vor%

Wenn ich es so kompiliere, (leere.s ist eine Datei der Länge Null)

%Vor%

Während der Laufzeit haben die bss-Abschnitte das Ausführungs-Bit auf magische Weise gesetzt, und alles funktioniert einfach großartig.

%Vor%

Also, wie werden diese Flags in der ELF eingerichtet? Und gibt es eine zuverlässige, korrekte Weise, einen bss Abschnitt mit rwx Erlaubnis zu erhalten?

Weitere Details - Softwareversionen

gcc Version 4.1.2 20080704 (Red Hat 4.1.2-48)
Linux 2.6.18-164.15.1.el5 x86_64 GNU / Linux

Danke

update - zuerst dachte ich, ich könnte mmap nicht benutzen, um dieses Problem zu lösen, wie caf vorgeschlagen, weil mmap gab mir Seiten zurück, die zu weit weg waren (ich wollte springen in der Nähe Code mit relativen Adressierung). Es stellt sich heraus, dass Sie mmap bitten können, sich darum zu kümmern, so - das MAP_32BIT wird Ihnen eine Seite in den ersten 2GB zurückgeben.

%Vor%     
auscoder 10.09.2010, 11:56
quelle

1 Antwort

1

Sie sollten wahrscheinlich einfach eine schreibbare, ausführbare anonyme Zuordnung mit mmap() anfordern, um Ihren generierten Maschinencode zu speichern.

    
caf 10.09.2010, 12:22
quelle

Tags und Links