con - gcc ubuntu
¿Cómo cambiar el punto de entrada del programa C con gcc? (3)
¿Cómo cambiar el punto de entrada de un programa en C compilado con gcc?
Al igual que en el siguiente código
#include<stdio.h>
int entry() //entry is the entry point instead of main
{
return 0;
}
Es un ajuste del enlazador:
-Wl,-eentry
la cosa -Wl,...
pasa los argumentos al vinculador, y el vinculador toma un argumento -e
para establecer la función de entrada
Puedes modificar tu código fuente como:
#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 sección ".interp" permitirá que su programa pueda llamar a una biblioteca compartida externa. La llamada de salida hará que su función de entrada salga del programa en lugar de regresar.
Luego construye el programa como una biblioteca compartida que es ejecutable:
$ gcc -shared -fPIC -e entry test_main.c -o test_main.so
$ ./test_main
Si está en un sistema que proporciona GNU Binutils (como Linux), puede usar el comando objcopy
para hacer que una función arbitraria sea el nuevo punto de entrada.
Supongamos que un archivo llamado program.c
contiene la función de entry
:
$ cat > program.c
#include <stdio.h>
int entry()
{
return 0;
}
^D
Primero lo compila usando
-c
para generar un archivo de objeto reubicable:$ gcc -c program.c -o program.o
A continuación, redefinir la
entry
para sermain
:$ objcopy --redefine-sym entry=main program.o
Ahora usa gcc para compilar el nuevo archivo de objeto:
$ gcc program.o -o program
NOTA: Si su programa ya tiene una función llamada main
, antes del paso 2, puede realizar una invocación de objcopy
separado:
objcopy --redefine-sym oldmain=main program.o