L'exécution de code machine dans la mémoire

Je suis à essayer de comprendre comment exécuter du code machine stockées dans la mémoire.

J'ai le code suivant:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    FILE* f = fopen(argv[1], "rb");

    fseek(f, 0, SEEK_END);
    unsigned int len = ftell(f);
    fseek(f, 0, SEEK_SET);

    char* bin = (char*)malloc(len);
    fread(bin, 1, len, f);

    fclose(f);

    return ((int (*)(int, char *)) bin)(argc-1, argv[1]);
}

Le code ci-dessus compile bien dans GCC, mais quand j'essaie d'exécuter le programme à partir de la ligne de commande comme ceci:

./my_prog /bin/echo hello

Le programme de segmentation. J'ai compris que le problème est sur la dernière ligne, comme en commentant les arrêts de l'erreur de segmentation.

Je ne pense pas que je vais le faire tout à fait le droit, car je suis toujours obtenir ma tête autour de pointeurs de fonction.

Est le problème à une défaillance de la fonte, ou quelque chose d'autre?

  • Charlie: Si jamais vous rendre sence de toutes ces réponses, plutôt coulé à l'aide d'un pointeur à une fonction que vous avez, vous pourriez être mieux adaptés à écrire des thunk qui gère la pile des arguments de façon dynamique. Si vous utilisez gcc, une fonction déclarée comme "fonction() attribut ((nu));" et voir gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html pour plus d'exemples. De cette façon, vous pouvez appeler la même fonction qui décide si le chargement dynamique de code devra être fourni avec N le nombre d'arguments/convention d'appel etc... de toute façon, vous devriez probablement lookino FFI et autres.
  • Je suis sûr que l'OP est juste de l'incompréhension des fondements de la façon dont les fichiers exécutables de travail. Utiliser une bibliothèque de liens dynamiques pour l'exécution de votre propre code dynamique, et exec pour exécuter d'autres applications.
  • Vous avez entièrement raison. Je voulais voir si je pouvais faire cela, alors j'ai pensé "où puis-je trouver le code machine?", et a décidé de prendre juste un fichier exécutable sans réfléchir plus sérieusement à ça :/
  • Vous pouvez avoir de la chance et compilation pour web de l'assemblée.