GNU/Linux >> Tutoriels Linux >  >> Linux

À quoi se réfère l'interpréteur signalé par `file` ?

J'essaie d'exécuter perl exécutable fourni par une bibliothèque de débogage sur Ubuntu 16.04, mais pour une raison quelconque, le fichier "n'est pas exécutable" même s'il semble correspondre à mon architecture.

Le perl l'exécutable fourni avec Ubuntu 16.04 est supprimé

$ nm /usr/bin/perl
nm: /usr/bin/perl: no symbols

Le perl-debug le paquet fournit un perl sous /usr/lib/debug qui n'est pas dépouillé.

$ nm /usr/lib/debug/usr/bin/perl | head
                 U [email protected]@GLIBC_2.2.5
0000000000589020 r AboveLatin1_invlist
                 U [email protected]@GLIBC_2.2.5
                 U [email protected]@GLIBC_2.2.5
000000000058e002 r a_hash.16944
                 U [email protected]@GLIBC_2.2.5
000000000058e010 r an_array.16943
00000000005795c0 r ASCII_invlist
0000000000543430 T ASCII_TO_NEED
                 U [email protected]@GLIBC_2.2.5

Cependant, lorsque vous essayez de l'exécuter, exec* échoue et bash vous donne un beau message :

$ /usr/lib/debug/usr/bin/perl
bash: /usr/lib/debug/usr/bin/perl: cannot execute binary file: Exec format error

Lorsque je lance file sur les deux perls cependant, je vois que le perl de débogage est marqué comme "ayant un interpréteur vide" où le perl normal a un objet partagé ld. Il a probablement une relation avec l'éditeur de liens ld , mais je ne sais pas ce que c'est.

$ file /usr/bin/perl
/usr/bin/perl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=e6106890a64a3316b2adfc04bbf202f13f82b5bb, stripped
$ file /usr/lib/debug/usr/bin/perl
/usr/lib/debug/usr/bin/perl: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter *empty*, for GNU/Linux 2.6.32, BuildID[sha1]=e6106890a64a3316b2adfc04bbf202f13f82b5bb, not stripped

Qu'est-ce qu'un file ? me dire quand il signale que l'interpréteur est vide ?

Réponse acceptée :

Le perl-débogage perl est à utiliser avec (par exemple) GDB, contenant les symboles pour comprendre un processus en cours d'exécution ou un vidage de l'autre perl . Par exemple, étant donné un processus en cours d'exécution perl script.pl avec le pid $PID , vous pouvez utiliser :

$ gdb /usr/lib/debug/usr/bin/perl $PID

pour s'y attacher, et faire toutes les choses habituelles de GDB à ce stade. Ce n'est pas un exécutable exécutable en soi et il manque les éléments nécessaires pour le lancer.

Les symboles sont conservés séparément car ils font plus du double de la taille de l'exécutable principal et sont très rarement nécessaires. Dans ce cas, les symboles sont utiles pour déboguer perl , plutôt que de déboguer un script Perl, et probablement utile uniquement si vous développez des extensions à lier.

Je ne pense pas que la définition du bit exécutable soit réellement nécessaire, mais Debian ne les supprime d'aucun de ses fichiers de symboles de débogage que je vois, il peut donc y avoir une situation qui en a besoin. file vous indique que l'interpréteur est vide parce qu'il l'est, puisque tous les fichiers non liés aux informations de débogage sont manquants.

En relation :Comment imprimer toutes les lignes après une correspondance jusqu'à la fin du fichier ?
Linux
  1. Que signifie la sortie de Ps ?

  2. Le point d'Uniq -u et à quoi ça sert ??

  3. Que fait Rackspace dans le cloud ?

  4. Quel est le but du fichier .bashrc sous Linux

  5. Quelle est la bonne façon d'utiliser inotify ?

Tail lit-il tout le fichier ?

Que signifie l'attribut "s" dans les autorisations de fichiers ? ?

Que fait Exec 3 ?

Qu'est-ce qu'un fichier .pid et que contient-il ?

Comment ça marche ? Que fait rm ?

Qu'est-ce que `S_ISREG()` et à quoi sert-il ?