Me preguntaba cómo funciona esto, creando una biblioteca y precargándola para que un programa pueda usarla en lugar de la que está en la declaración de inclusión.
esto es lo que estoy haciendo y no está funcionando hasta ahora.
//shared.cpp int rand(){ return 33; } //prograndom.cpp #include <stdio.h> #include <stdlib.h> #include <time.h> int main(){ srand(time(NULL)); int i = 10; while(i--) printf("%d\n", rand()%100); return 0; }Luego en la terminal:
$ gcc -shared -fPIC shared.cpp -o libshared.so $ gcc prograndom.cpp -o prograndom $ export LD_PRELOAD=/home/bob/desarrollo/libshared.soy finalmente
$ LD_PRELOAD=/home/bob/desarrollo/libshared.so ./prograndomque no imprime 33, solo números aleatorios...
Sus programas son programas C, pero la extensión de archivo cpp implica C++, y GCC lo interpretará de esa manera.
Eso es un problema porque significa que su función rand (en shared.cpp ) se compilará como una función de C++, con su nombre alterado para incluir su firma de tipo. Sin embargo, en main #include <stdlib.h> , que tiene el efecto de declarar:
extern "C" int rand(); y ese es el rand que buscará el enlazador. Entonces su PRECARGA no tendrá efecto.
Si cambia el nombre del archivo de shared.cpp a shared.c , funcionará como se espera.
Otras alternativas, de dudoso valor, son:
Declare que rand es extern "C" en su archivo shared.cpp . A continuación, puede compilarlo como C++.
Fuerce la compilación como C usando la opción GCC -xc .