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%