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í.