GNU/Linux >> Znalost Linux >  >> Linux

Jak zjistit, zda je daná sdílená knihovna postavena se symboly ladění nebo ne?

Všimněte si, že not stripped neznamená ladicí symboly.

Kód knihovny:

//myshared.c
#include <stdio.h>

void print_from_lib()
{
    printf("Printed from shared library\n");
}

Kompilace sa bez příznaků ladění:

gcc -c -Wall -Werror -fpic myshared.c
gcc -shared -o libmyshared.so myshared.o
gcc -g -c -Wall -Werror -fpic myshared.c -o myshared-g.o
gcc -g -shared -o libmyshared-g.so myshared-g.o

Kontrola pomocí file

$ file libmyshared.so
libmyshared.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=1ad3b94d5c8a7392c2140a647254753221a152cd, not stripped
$ file libmyshared-g.so 
libmyshared-g.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=0268eaf97e5a670d2f7e767a011be6f06a83090a, not stripped

Oba tvrdí, že nejsou svlečení. Nicméně pouze libmyshared-g.so zobrazuje symboly:

$ objdump --syms libmyshared.so | grep debug
$ objdump --syms libmyshared-g.so | grep debug
0000000000000000 l    d  .debug_aranges 0000000000000000              .debug_aranges
0000000000000000 l    d  .debug_info    0000000000000000              .debug_info
0000000000000000 l    d  .debug_abbrev  0000000000000000              .debug_abbrev
0000000000000000 l    d  .debug_line    0000000000000000              .debug_line
0000000000000000 l    d  .debug_str 0000000000000000              .debug_str

Chcete-li zjistit, zda je soubor stripped, můžete použít příkaz file . V podstatě to znamená, že ladicí symboly jsou nebo nejsou.

Zde je jeden soubor z mého systému:

$ file libjsd.so
     libjsd.so: ELF 32-bit LSB shared object, \
     Intel 80386, version 1 (SYSV), dynamically linked, 
     stripped

Všimněte si svlečeného.

Zde je něco, co jsem zkompiloval:

$ file libprofile_rt.so
libprofile_rt.so: ELF 64-bit LSB shared object, x86-64, 
      version 1 (SYSV), dynamically linked, 
     BuildID[sha1]=0x..., not stripped

viz 'not striped', což znamená, že má ladicí symboly.

Je také možné oddělit ladicí symboly od samotného sdíleného objektu pomocí objcopy. To by extrahovalo symboly do jiného souboru a pak byste museli znát odkaz, abyste je dostali zpět. Můžete se podívat na pokyny, jak to udělat s gdb pomocí build-ids. To je užitečné, pokud chcete doručit něco bez symbolů, ale pak to dokážete odladit v malém množství z výpisu.


Linux
  1. Jak může bash skript znát adresář, ve kterém je nainstalován, když je zdrojem . operátor?

  2. Jak zjistím, jaké všechny symboly jsou exportovány ze sdíleného objektu?

  3. Jak ohraničit -f nejnovější soubor protokolu s daným vzorem

  1. Jak zobrazím seznam funkcí, které exportuje sdílená knihovna Linuxu?

  2. Jak udělat verzování sdílené knihovny v Linuxu?

  3. Jak ladit linuxové jádro pomocí GDB a QEMU?

  1. Jak nastavit googleTest jako sdílenou knihovnu v Linuxu

  2. Jak zjistím, zda je povolena volba set -e nebo ne?

  3. Jak sdílet připojení k internetu?