J'ai rencontré quelques problèmes lors de l'utilisation LD_PRELOAD pour charger mon.lib spécifié par LD_PRELOAD ne peut pas être chargé
Les étapes sont les suivantes:
libtest.c:
void fun() { return }
gcc -o libtest.so libtest.c -fPIC --shared
LD_PRELOAD export =
pwd
/libtest.somai n.c
extern void fun(); void main() { fun() }
gcc -o principale -L. main.c -ltest
Puis
ldd main
ldd main linux-vdso.so.1=>(0x00007ffff7ffd000) /home/shiyanlou/Code/libtest.so(0x00007ffff7df9000) libtest.so=>not found libc.so.6=>/lib/x86_64-linux-gnu/libc.so.6 (0x00007ffffa29000) /lib64/ld-linux-x86-64.so.2 (0x0000555555554000)
- execute principale
./main
il favorise: erreur lors du chargement bibliothèque partagée: libtest.so. Impossible d'ouvrir le fichier d'objet partagé: aucun fichier ou répertoire de ce type.
Je me demande pourquoi cela m'indique que libtest.so est introuvable Après avoir exporté la variable LD_PRELOAD. Cependant, j'ai aussi essayé d'utiliser LD_PRELOAD pour spécifier une lib partagée différente (pas "libc.so") pour injecter la fonction malloc, ça marche! Pourquoi LD_PRELOAD ne fonctionne que pour la bibliothèque partagée qui n'a pas été utilisée lors de la liaison ???
Salut, merci pour votre aide. Je sais que votre méthode fonctionne. Mais je veux juste savoir pourquoi LD_PRELOAD ne fonctionne pas pour la lib que j'ai utilisé pour lier mon programme exécutable? – Larry
Parce qu'il est déjà chargé? '-ltest' rend une dépendance DSO dure et ce n'est pas ce que LD_PRELOAD est à propos. Vous vous méprenez sur le but. Peut-être que si vous copiez un autre nom et que vous le chargez à la place. 'cp libtest.so libtest9.so' alors' LD_PRELOAD =./libtest9.so./main' Puisque 'libtest.so' est déjà chargé d'où le' /home/shiyanlou/Code/libtest.so (0x00007ffff7df9000) 'par défaut l'éditeur de liens dynamique ne chargera un DSO qu'une seule fois dans l'espace adresse du processus. En copiant le fichier, il devient un DSO différent. –
Merci pour votre explication. En résumé, j'utilise 'libtest.so' pour créer une dépendance DSO, et LD_PRELOAD est également défini sur'/home/shiyanlou/Code/libtest.so'. Quand j'exécute ./main, il chargera 'libtest.so' en raison de la dépendance de DSO plutôt que LD_PRELOAD. Et puis LD_PRELOAD sera ignoré car le même DSO a déjà été chargé. En conséquence, le fichier libtest.so n'est pas chargé et './Main' n'a pas pu être exécuté. Ai-je raison? Si oui, pourquoi LD_PRELOAD s'appelle LD_PRELOAD? Ne devrait-il pas être chargé avant tout autre DSO ?? – Larry