2011-02-03 5 views
3

J'essaie d'utiliser LD_PRELOAD.Aide LD_PRELOAD

original.cpp

void myPuts() { 
    puts ("Hello myPuts"); 
} 
int main() { 
    myPuts(); 
    return 0; 
} 

hacked.cpp

void myPuts() { 
    std::cout >> "Hello hacked myPuts"; 
} 

Je compile original.cpp:

g++ original.cpp 

Et hacked.cpp:

g++ -shared -fPIC hacked.cpp 

J'essaie:

LD_PRELOAD=./hacked.so ./original.out 

La chaîne "Bonjour piraté myPuts" devrait être vu par "Hello myPuts" apparaît. (Si j'essaie de "remplacer" la fonction puts, cela fonctionne correctement)

Qu'est-ce qui me manque?

+0

Si vous publiez un bloc de code, vous pouvez mettre en retrait chaque ligne avec un minimum de 4 places et le site sera automatiquement le format comme code. L'avantage de cette méthode par rapport aux backticks est que vous obtenez une coloration syntaxique. Vous pouvez également mettre en surbrillance le bloc entier et cliquer sur le bouton '{}' dans la barre d'outils. Juste pour que vous sachiez pour référence future. :-) –

+0

Merci, je le ferai!:-) – krisy

Répondre

3

Vous devriez avoir:

main.cpp

int main() { 
    myPuts(); 
    return 0; 
} 

original.cpp

void myPuts() { 
    puts ("Hello myPuts"); 
} 

hacked.cpp

void myPuts() { 
    std::cout << "Hello hacked myPuts"; 
} 

tous Compiler:

g++ -shared -fPIC original.cpp -o liboriginal.so 
g++ -shared -fPIC hacked.cpp -o libhacked.so 
g++ main.cpp -loriginal -o main.out 

Et en utilisant:

LD_PRELOAD=./libhacked.so ./main.out 
+0

Merveilleux, merci! Dernière question: ** g ++ main.cpp -loriginal ** ne fonctionne pas pour moi; Je reçois un message d'erreur ** can not find -loriginal ** :-( – krisy

+0

Vous devez compiler original.cpp avec 'g ++ -shared -fPIC original.cpp -o liboriginal.so' avec le nom correct dans libXXX.so , l'éditeur de liens trouvera la lib lors de la compilation de main.cpp –

+0

Pour référence future: compiler main.cpp avec -L ./ indique au compilateur, de rechercher les bibliothèques dans le répertoire courant Exécuter main.out: LD_LIBRARY_PATH =. /. /main.out (de cette façon, librairie.so sera recherché dans le répertoire courant) – krisy

6

De l'homme Ld.so

LD_PRELOAD

Une liste séparés par des espaces de supplémentaires, spécifié par l'utilisateur, bibliothèques ELF à charger avant tous les autres. Cela peut être utilisé pour remplacer de manière sélective les fonctions autres bibliothèques partagées.

Si myPuts était dans la bibliothèque partagée liée à l'application principale, il fonctionnerait, mais pas quand myPuts existe dans l'application et n'a pas résolu dans une bibliothèque externe.

+0

Notez que si l'application est construite de telle sorte que la fonction en question reste un symbole faible après la liaison finale, il peut être possible de remplacer ses fonctions de la bibliothèque partagée - mais cela nécessite une coopération du développeur de l'application. – bdonlan

Questions connexes