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.