Как изменить точку входа программы C с помощью gcc? - PullRequest
25 голосов
/ 21 сентября 2011

Как изменить точку входа в программу на C, скомпилированную с помощью gcc?
Как в следующем коде

#include<stdio.h>
int entry()  //entry is the entry point instead of main
 {
   return 0;
 }

Ответы [ 3 ]

30 голосов
/ 21 сентября 2011

Это настройка компоновщика:

-Wl,-eentry

вещь -Wl,... передает аргументы компоновщику, а компоновщик принимает аргумент -e для установки функции входа

8 голосов
/ 10 августа 2014

Вы можете изменить свой исходный код следующим образом:

#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);
}

Раздел ".interp" позволит вашей программе вызывать внешнюю общую библиотеку.Вызов выхода заставит вашу функцию входа выйти из программы вместо возврата.

Затем создайте программу как разделяемую библиотеку, которая является исполняемой:

$ gcc -shared -fPIC -e entry test_main.c -o test_main.so
$ ./test_main
6 голосов
/ 15 декабря 2015

Если вы работаете в системе, которая предоставляет GNU Binutils (например, Linux), вы можете использовать команду objcopy, чтобы сделать произвольную функцию новой точкой входа.

Предположим, чтофайл с именем program.c, содержащий функцию entry:

$ cat > program.c
#include <stdio.h>
int entry()
{
    return 0;
}
^D
  1. Сначала вы компилируете его, используя -c, для создания перемещаемого объектного файла:

    $ gcc -c program.c -o program.o
    
  2. Затем вы переопределяете entry на main:

    $ objcopy --redefine-sym entry=main program.o
    
  3. Теперь используйте gcc для компиляции нового объектного файла:

    $ gcc program.o -o program
    

ПРИМЕЧАНИЕ: Если в вашей программе уже есть функция с именем main, перед шагом 2 вы можете выполнить отдельный вызов objcopy:

objcopy --redefine-sym oldmain=main program.o
...