Jak wylistować symbole w a.so plik

Jak wyeksportować symbole z pliku. so? Jeśli to możliwe, chciałbym również znać ich źródło(np. jeśli są pobierane ze statycznej biblioteki).

Używam gcc 4.0.2, jeśli to robi różnicę.

Author: Andrey Nikolov, 2008-08-29

11 answers

Standardowym narzędziem do wypisywania symboli jest nm, możesz go użyć po prostu tak:

nm -gD yourLib.so

Jeśli chcesz zobaczyć symbole biblioteki C++, Dodaj opcję "- C", która demangle Symbole(jest znacznie bardziej czytelny demangled).

nm -gDC yourLib.so

Jeśli plik .so jest w formacie elf, masz dwie opcje:

Albo objdump (-C jest również przydatny do demanglingu C++):

$ objdump -TC libz.so

libz.so:     file format elf64-x86-64

DYNAMIC SYMBOL TABLE:
0000000000002010 l    d  .init  0000000000000000              .init
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 free
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 __errno_location
0000000000000000  w   D  *UND*  0000000000000000              _ITM_deregisterTMCloneTable

Lub użyć readelf:

$ readelf -Ws libz.so
Symbol table '.dynsym' contains 112 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000002010     0 SECTION LOCAL  DEFAULT   10
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND free@GLIBC_2.2.5 (14)
     3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __errno_location@GLIBC_2.2.5 (14)
     4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable
 624
Author: Steve Gury,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-11-25 22:04:40

Jeśli Twój plik .so jest w formacie elf, możesz użyć programu readelf do wyodrębnienia informacji o symbolu z pliku binarnego. Polecenie To da Ci tabelę symboli:

readelf -Ws /usr/lib/libexample.so

Powinieneś wyodrębnić tylko te, które są zdefiniowane w tym pliku .so, a nie w bibliotekach, do których się odnosi. W tym przypadku siódma kolumna powinna zawierać numer. Można go wyodrębnić za pomocą prostego wyrażenia regularnego:

readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+'

Lub, jak proponuje Caspin,:

readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';
 86
Author: P Shved,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:32
objdump -TC /usr/lib/libexample.so
 56
Author: Pavel Lapin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-15 18:25:47

Dla bibliotek współdzielonych libNAME.so przełącznik-D był niezbędny, aby zobaczyć symbole w moim Linuksie

nm -D libNAME.so

I dla biblioteki statycznej, o której pisali inni

nm -g libNAME.a
 44
Author: cavila,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-06 19:54:44

Zastanawiałem się, dlaczego -fvisibility=hidden i #pragma GCC visibility nie wydaje się mieć żadnego wpływu, ponieważ wszystkie symbole były zawsze widoczne z nm - dopóki nie znalazłem tego postu, który wskazał mi readelf i objdump , który uświadomił mi, że wydaje się, że faktycznie są {11]} dwa tabele symboli:

  • ten, który możesz wymienić za pomocą nm
  • ten, który możesz wymienić za pomocą readelf i objdump

Myślę, że pierwsza zawiera symbole debugowania, które można usunąć za pomocą strip lub przełącznika-s, który można podać linkerowi lub komendzie install. I nawet jeśli nm nie wyświetla już niczego, wyeksportowane symbole są nadal eksportowane, ponieważ znajdują się w "dynamicznej tabeli symboli ELF", która jest ostatnią.

 36
Author: Peter Remmers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-09-07 08:55:02

Dla plików C++ .so ostateczną komendą nm jest nm --demangle --dynamic --defined-only --extern-only <my.so>

# nm --demangle --dynamic --defined-only --extern-only /usr/lib64/libqpid-proton-cpp.so | grep work | grep add
0000000000049500 T proton::work_queue::add(proton::internal::v03::work)
0000000000049580 T proton::work_queue::add(proton::void_function0&)
000000000002e7b0 W proton::work_queue::impl::add_void(proton::internal::v03::work)
000000000002b1f0 T proton::container::impl::add_work_queue()
000000000002dc50 T proton::container::impl::container_work_queue::add(proton::internal::v03::work)
000000000002db60 T proton::container::impl::connection_work_queue::add(proton::internal::v03::work)

Źródło: https://stackoverflow.com/a/43257338

 22
Author: user7610,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-08 15:50:30

Spróbuj dodać -l do FLAG nm, aby uzyskać źródło każdego symbolu. Jeśli Biblioteka jest skompilowana z informacjami o debugowaniu (gcc-g), powinien to być plik źródłowy i numer linii. Jak powiedział Konrad, plik obiektowy / biblioteka statyczna jest prawdopodobnie nieznana w tym momencie.

 12
Author: Adam Mitz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-29 21:22:13

NDK toolchain dla Androida zawiera wymagane narzędzia wymienione w innych odpowiedziach: readelf, objdump i nm.

 12
Author: Adi Shavit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-04 15:33:32

Możesz użyć narzędzia nm -g z łańcucha narzędzi binutils. Jednak ich źródło nie zawsze jest łatwo dostępne. i nie jestem nawet pewien, czy te informacje zawsze można odzyskać. Być może objcopy ujawnia dalsze informacje.

/ EDIT: NAZWA NARZĘDZIA to oczywiście nm. Flaga -g jest używana do wyświetlania tylko eksportowanych symboli.

 11
Author: Konrad Rudolph,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-29 17:07:11

Nm-g wyświetla zmienną extern, która nie jest konieczna. Każda niestatyczna zmienna zakresu plików (w C) jest zmienną extern.

Nm-D wyświetli symbol w dynamicznej tabeli, którego adres można znaleźć za pomocą dlsym.

Nm --version

GNU nm 2.17.50.0.6-12.el5 20061020

 7
Author: zhaorufei,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-11 07:00:56

Jeśli chcesz tylko wiedzieć, czy istnieją symbole obecne możesz użyć

objdump -h /path/to/object

Lub wyświetlenie informacji o debugowaniu

objdump -g /path/to/object
 2
Author: Craig Ringer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-08 11:30:53