2011-11-02 15 views

Respuesta

8

La pregunta es sobre el lenguaje C, por lo que la respuesta debe ser no - no hay nada en el lenguaje solo que defina algo así como almacenar una función en el montón.

Sin embargo, si agregamos conocimiento de los detalles de implementación y el sistema operativo (tablas de reubicación, protección de página, etc.), entonces sí, es posible. Por ejemplo, los cargadores de códigos dinámicos personalizados (que no utilizan la carga DLL/SO proporcionada por el sistema operativo) funcionan de esta manera.

0

En sentido general, la respuesta es No; porque las instrucciones del código deben conocerse en tiempo de compilación.

bibliotecas vinculadas dinámicamente puede ser una coincidencia más cercana, ser liberal.

1

Cuando un programa se carga en memoria, se organiza principalmente en tres áreas de memoria, llamadas segmentos:

  • el segmento de texto
  • segmento de pila
  • segmento montón

El segmento de texto (también llamado segmento de código) es donde reside el código compilado del programa en sí. Ya que 'NUEVAS INSTRUCCIONES' o 'NUEVAS FUNCIONES' se conocerán en tiempo de compilación, por lo que no podemos almacenarlas en Heap.

Espero que esto ayude a responder su consulta.

8

Sí, por supuesto. ¿Qué piensas que es just-in-time compiler? Algunos stack smashing attacks funcionan según un principio similar (la ejecución del código en la pila, en lugar del montón). Esta es una razón por la cual los sistemas operativos modernos tienen protección contra la ejecución de páginas de "datos". (Los generadores de código dinámico legítimo tendrían que desactivar dicha protección). Véase también el artículo de Wikipedia en self-modifying code.

+4

+1 por la única respuesta en un mar de "No, mal, aléjate" que dice "Bueno, sí, en realidad". –

+1

De acuerdo. JVM proporciona el mecanismo de carga .class en tiempo de ejecución en la pila y llama a su función de forma dinámica. Pero Aditya está pidiendo agregar funciones en montón específicamente en el lenguaje C – Alam

1

Seguramente puede almacenar cualquier cosa como datos, instrucciones incluidas, pero si podrá o no ejecutar esas instrucciones y de qué manera depende mucho del compilador y la plataforma. Tendrá que profundizar en los detalles de bajo nivel de ambos para hacerlo correctamente sin colgar o colgar el programa o el entorno (por ejemplo, un sistema operativo primitivo que carece de protección de las aplicaciones).

Here es un ejemplo de almacenamiento de la instrucción x86 BSWAP como datos en una matriz (no asignada dinámicamente, pero que en general no debería importar) y ejecutarla. El ejemplo realmente almacena como datos, no la única instrucción BSWAP, sino una rutina completa C-involable que se adhiere a la convención de llamadas obligatoria del compilador que rige cómo se pasan los parámetros y se devuelven los valores devueltos.

El ejemplo es una aplicación de Windows de 32 bits y como debe ejecutarse en Windows, también debe asegurarse de que la región que contiene las instrucciones esté marcada como legible y ejecutable (la primera se otorga por el hecho de que son en una matriz que puede leerse y escribirse y la segunda está garantizada llamando a la función VirtualProtect() para indicar al sistema operativo que marque la región como ejecutable, lo cual es necesario porque el sistema operativo intenta protegernos de la ejecución accidental de código que puede ser malicioso (por ejemplo, datos no confiables provenientes de Internet)).

+0

¡Muchas gracias a todos! Aprecia toda tu ayuda. – Aditya369

Cuestiones relacionadas