2009-08-10 7 views
3

En vérifiant la source de/usr/bin/ldd, je vois qu'il utilise ld-linux pour trouver les dépendances d'un exécutable, bien qu'il appelle d'abord ld-linux avec --verify argument. Ensuite, le script agit différemment selon le code de sortie de l'appel ld-linux --verify.ld-linux --verify codes de sortie

La page de manuel de ld-linux ne fournit aucune information sur les codes de sortie, et une recherche Google ne transforme rien en valeur. Y a-t-il de la documentation quelque part (sauf en regardant le code source de ld-linux) qui fournit une liste de codes de sortie pour ld-linux --verfify et leurs significations respectives?

Répondre

1

J'ai fait quelques expériences et l'état de sortie est zéro en cas de succès et 1 en cas d'échec. Cela inclut les abus grotesques tels que le demander de vérifier un script shell.

Vous seriez en sécurité en supposant zéro en cas de succès, non nul en cas d'échec, et aucune autre information.

+0

Ce n'est malheureusement pas le cas. Zéro est en effet "succès", mais il y a une pléthore de valeurs non nulles, avec beaucoup de signification pour chacun. par exemple, ldd agit d'une manière si la valeur de retour est 0 ou 2, et d'une autre manière si la valeur de retour est 5. Cependant, je n'ai aucune idée de ce que 2 signifie (5 signifie "invoqué avec __libc_enable_secure selon un commentaire dans le script) Donc je ne peux que supposer que 2 signifie quelque chose, et qu'il y en a un 3 et un 4 (au moins) – Fred

+0

@Fred: Bletch Vous ne nous avez pas dit pourquoi vous aviez besoin de savoir, mais le seul conseil que je vous ai laissé est d'il y a longtemps et loin, très loin: utilisez la source, Luke! –

1

Je ne trouve aucun document, mais ...

if (__builtin_expect (mode, normal) == verify) 
    { 
     /* We were called just to verify that this is a dynamic 
     executable using us as the program interpreter. Exit with an 
     error if we were not able to load the binary or no interpreter 
     is specified (i.e., this is no dynamically linked binary. */ 
     if (main_map->l_ld == NULL) 
     _exit (1); 

     /* We allow here some platform specific code. */ 
#ifdef DISTINGUISH_LIB_VERSIONS 
     DISTINGUISH_LIB_VERSIONS; 
#endif 
     _exit (has_interp ? 0 : 2); 
    } 

Alors ...

  • 0 signifie le succès, à savoir « programme est lié dynamiquement et cette dynamique de liaison peut gérer
  • 1 signifie que ld-linux n'a pas pu charger le fichier binaire (j'ai obtenu lorsque j'ai lancé ld-linux avec un fichier binaire inexistant, non-binaire ou statique)
  • 2 signifie "aucun interpréteur n'est spécifié". Plus précisément, il n'y a pas d'élément avec p_type égal PT_INTERP dans la table d'en-tête de programme (je l'obtiens quand je lance ld-linux avec la bibliothèque partagée)

Il n'y a pas d'autres codes.