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ę.
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
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}';
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
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
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ą.
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)
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.
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
.
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.
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
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
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