GNU/Linux >> Znalost Linux >  >> Linux

Na co se vztahuje tlumočník hlášený `souborem`?

Snažím se spustit perl spustitelný soubor poskytovaný ladicí knihovnou na Ubuntu 16.04, ale z nějakého důvodu soubor „není spustitelný“, i když se zdá, že odpovídá mé architektuře.

perl spustitelný soubor dodávaný s Ubuntu 16.04 je odstraněn

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

perl-debug balíček poskytuje perl pod /usr/lib/debug která není svlečená.

$ 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

Když se jej však pokusíte spustit, exec* selže a bash vám dává pěknou zprávu:

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

Když spustím file na dvou perlech však vidím, že ladicí perl je označen jako „mající prázdný interpret“, kde běžný perl má nějaký sdílený objekt ld. Pravděpodobně má nějaký vztah k linkeru ld , ale nevím, co to je.

$ 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

Co přesně je file říká mi, když to hlásí, že je tlumočník prázdný?

Přijatá odpověď:

Perl-debug perl je pro použití s ​​(například) GDB, která obsahuje symboly pro pochopení běžícího procesu nebo výpisu jiného perl . Například při běžícím procesu perl script.pl s pid $PID , můžete použít:

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

připojit se k němu a dělat všechny obvyklé věci GDB v tomto bodě. Není to spustitelný spustitelný soubor sám o sobě a postrádá potřebné prvky ke spuštění.

Symboly jsou uchovávány odděleně, protože jsou více než dvojnásobné velikosti hlavního spustitelného souboru a jsou potřeba jen velmi zřídka. V tomto případě jsou symboly užitečné pro ladění perl , spíše než ladění skriptu v Perlu a pravděpodobně užitečné pouze v případě, že vyvíjíte rozšíření, do kterých chcete odkazovat.

Nemyslím si, že nastavení spustitelného bitu je ve skutečnosti vyžadováno, ale Debian je neodstraní ze žádného ze svých souborů se symbolem ladění, které vidím, takže může nastat situace, která to potřebuje. file říká vám, že interpret je prázdný, protože je prázdný, protože chybí všechny soubory nesouvisející s informacemi o ladění.

Související:Jak vytisknout všechny řádky po shodě až do konce souboru?
Linux
  1. Linux – Co znamená tečka za bity oprávnění souboru?

  2. Čte Tail celý soubor?

  3. Co znamená ve výstupu Ps?

  1. Point of Uniq -u a co to dělá??

  2. Jaký je správný způsob použití inotify?

  3. Co dělá systémové volání brk()?

  1. Co je soubor .pid a co obsahuje?

  2. Co je to `S_ISREG()` a co dělá?

  3. Co znamená „rc“ v „.bashrc“ atd.?