Mam udostępniony obiekt (dll). Jak mogę się dowiedzieć, jakie są z tego eksportowane wszystkie symbole?
linux
shared-libraries
rozdz
źródło
źródło
Odpowiedzi:
Czy masz „obiekt współużytkowany” (zwykle bibliotekę współużytkowaną w systemie AIX), bibliotekę współużytkowaną UNIX lub bibliotekę DLL systemu Windows? To są różne rzeczy, a twoje pytanie łączy je wszystkie :-(
dump -Tv /path/to/foo.o
.readelf -Ws /path/to/libfoo.so
lub (jeśli masz GNU nm)nm -D /path/to/libfoo.so
.dumpbin /EXPORTS foo.dll
.źródło
nm
działa również na MacOSX, z wyjątkiem-D
opcji. Lubbrew install binutils
i użyj wersji GNU przezgnm
. Dla GNUnm
,--demangle
jest również przydatna. Równieżgobjdump
.linux
więc myślę, że można bezpiecznie powiedzieć, że @chappar ma współdzieloną bibliotekę Linuksa.objdump to kolejny dobry na Linuksa.
źródło
Jeśli jest to plik DLL systemu Windows, a Twój system operacyjny to Linux, użyj winedump :
źródło
Na * nix sprawdź nm. W systemie Windows użyj programu Dependency Walker
źródło
nm --defined-only -g something.so
wydrukuje symbole, które są zarówno zdefiniowane w bibliotece, jak i symbole zewnętrzne, co prawdopodobnie jest tym, czego chce OP.zobacz man nm
źródło
Posługiwać się:
nm --demangle <libname>.so
źródło
nm: /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6: no symbols
.readelf
lub-D
flaga działa.Sposób międzyplatformowy (nie tylko sam wieloplatformowy, ale także współpracujący przynajmniej z obydwoma
*.so
i*.dll
) polega na użyciu radare inżynierii wstecznej2 . Na przykład:Jako bonus
rabin2
rozpoznaje na przykład zniekształcenie nazw w C ++ (a także z.so
plikiem) :Działa również z plikami obiektowymi:
źródło
Możesz użyć gnu objdump.
objdump -p your.dll
. Następnie przejdź do.edata
zawartości sekcji, a wyeksportowane funkcje znajdziesz pod[Ordinal/Name Pointer] Table
.źródło
Zwykle masz również plik nagłówkowy, który dołączasz do kodu, aby uzyskać dostęp do symboli.
źródło