web-dev-qa-db-fra.com

Comment changer le point d'entrée du programme C avec gcc?

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;
 }
28
asitm9

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

32
Foo Bah

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
8
Sam Liao

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
  1. 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
    
  2. Ensuite, vous redéfinissez entry pour être main:

    $ objcopy --redefine-sym entry=main program.o
    
  3. 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
6
Rudy Matela