Consulte the answer I just posted a esa pregunta. Puede usar la biblioteca callback(3)
para generar nuevas funciones en tiempo de ejecución. No es compatible con los estándares, ya que implica muchos hacks específicos de la plataforma, pero funciona en una gran cantidad de sistemas.
La biblioteca se ocupa de asignar memoria, asegurarse de que la memoria sea ejecutable y de enjuagar la caché de instrucciones si es necesario para garantizar que el código generado dinámicamente (es decir, el cierre) sea ejecutable. En esencia, genera talones de código que podría tener este aspecto en x86:
pop %ecx
push $THUNK
push %ecx
jmp $function
THUNK:
.long $parameter
Y a continuación, devuelve la dirección de la primera instrucción. Lo que hace este stub es almacenar la dirección de retorno en ECX (un registro reutilizable en la convención de llamadas x86), empuja un parámetro extra en la pila (un puntero a un procesador) y luego vuelve a presionar la dirección de retorno. Luego, salta a la función real. Esto hace que la función se deje engañar al pensar que tiene un parámetro extra, que es el contexto oculto del cierre.
En realidad es más complicado que eso (la función real llamada al final del código es __vacall_r
, no la función en sí, y __vacall_r()
maneja más detalles de implementación), pero ese es el principio básico.
No creo que sea necesario proporcionar un enlace a la página superior de stackoverflow.com en su pregunta. –
La pregunta a la que se vincula es acerca de cómo hacerlo en C++. Esta pregunta está etiquetada C. ¿De qué quieres saber? –
La solución que Barry proporcionó está en C. La mayoría de los comentarios sugirieron que no es posible resolver mi primera pregunta en C++. – Alexandru