Comment changer le point d'entrée d'un programme C compilé avec gcc?
Tout comme dans le code suivant
#include<stdio.h>
int entry() //entry is the entry point instead of main
{
return 0;
}
C'est un paramètre de l'éditeur de liens:
-Wl,-eentry
les -Wl,...
chose transmet des arguments à l'éditeur de liens, et l'éditeur de liens prend un -e
argument pour définir la fonction d'entrée
Vous pouvez modifier votre code source comme:
#include<stdio.h>
const char my_interp[] __attribute__((section(".interp"))) = "/lib/ld-linux.so.2";
int entry() //entry is the entry point instead of main
{
exit(0);
}
La section ".interp" permettra à votre programme d'appeler une bibliothèque partagée externe. L'appel de sortie fera de votre fonction d'entrée pour quitter le programme au lieu de revenir.
Construisez ensuite le programme en tant que bibliothèque partagée exécutable:
$ gcc -shared -fPIC -e entry test_main.c -o test_main.so
$ ./test_main
Si vous êtes sur un système qui fournit GNU Binutils (comme Linux), vous pouvez utiliser la commande objcopy
pour faire d'une fonction arbitraire le nouveau point d'entrée.
Supposons un fichier appelé program.c
contenant la fonction entry
:
$ cat > program.c
#include <stdio.h>
int entry()
{
return 0;
}
^D
Vous devez d'abord le compiler en utilisant -c
pour générer un fichier objet déplaçable:
$ gcc -c program.c -o program.o
Ensuite, vous redéfinissez entry
pour être main
:
$ objcopy --redefine-sym entry=main program.o
Utilisez maintenant gcc pour compiler le nouveau fichier objet:
$ gcc program.o -o program
REMARQUE: Si votre programme a déjà une fonction appelée main
, avant l'étape 2, vous pouvez effectuer une objcopy
distincte invocation:
objcopy --redefine-sym oldmain=main program.o