Ponieważ ldd
zawiera tylko biblioteki dynamiczne, czy istnieje sposób na wyodrębnienie informacji o statycznych bibliotekach używanych do tworzenia pliku wykonywalnego?Wyświetl listę bibliotek statycznych używanych w pliku wykonywalnym
Odpowiedz
ldd <exe filename>
pokazuje dynamicznie powiązane biblioteki
nm <exe filename>
przedstawia symbole w pliku.
Aby zobaczyć, które symbole pochodzą z bibliotek statycznych, należy uruchomić nm
w tych bibliotekach, aby uzyskać listę symboli (funkcji itp.), A następnie porównać je z listą symboli z nm <exe filename>
.
Porównuje się listy z poleceniem comm
. Aby uzyskać szczegółowe informacje, patrz man comm
.
To zostało zrobione z tego forum here.
Nie, nazwy bibliotek są odrzucane podczas procesu łączenia. Jeśli jednak plik wykonywalny zawiera informacje debugowania (tzn. Został skompilowany z flagą -g), może być możliwe uzyskanie z tego informacji.
Czy nie można rozpoznać ASA RAW, czy optymalizacja kompilatora i flagi również mają na to wpływ? – MrMesees
Chyba, że dany kompilator przechowuje jakieś dane meta wewnątrz pliku binarnego, wtedy nie. Biblioteka statyczna to kod, który jest bezpośrednio wkompilowany w plik binarny.
Jeśli masz kod źródłowy i nie chcesz przechodzić przez cały ten kod, możesz wygenerować plik mapy podczas kompilacji, aby wiedzieć, które statyczne biblioteki są połączone.
Na przykład g++ -Xlinker -Map=a.map main.c
, sprawdź plik mapy dla połączonych informacji z biblioteki statycznej.
Nie ma sposobu, aby uzyskać listę bibliotek statycznych wewnątrz jakiegoś pliku wykonywalnego ELF.
Ponieważ dla łącznika, biblioteka statyczna jest właśnie używana jako "leniwy" zestaw elementów. Wynikowy plik wykonywalny ELF zawierałby tylko członków potrzebnych do połączenia. Zatem członkowie tacy jak foo2.o
z libfoo.a
są połączeni tak, jakby plik obiektów foo2.o
został połączony z plikiem wykonywalnym (pod warunkiem, że potrzebny jest jakiś symbol zdefiniowany w foo2
, tj. Jest gdzieś odwoływany).
Oczywiście, używając nm
lub objdump
lub readelf
lub strings
na jakiegoś pliku wykonywalnego ELF może dać pewne wskazówki na temat tego, co pliki wynikowe (w tym tych pochodzących z statycznych bibliotek) są w środku, bo zobaczysz symbole zdefiniowane w (elementach) tych statycznych bibliotek (lub literalnych łańcuchach używanych w nich).
jakie wskazówki masz na myśli? Czy możesz podać przykłady? Czy możesz wskazać mi źródło, w którym mogę znaleźć więcej takich wskazówek? – stackoverflowwww
Używanie readelf na przykład wyświetli funkcje, obiekty, symbole używane w pliku binarnym. Mogą one służyć jako podpowiedź do znalezienia używanych bibliotek. Na przykład możesz zobaczyć funkcję Curl_http i wiedzieć, że libcurl jest najprawdopodobniej używany przez plik binarny i jeśli nie jest dynamicznie połączony, musi być połączony statycznie. – ohgodnotanotherone
- 1. łączenia bibliotek statycznych w pojedyncze
- 2. Czas ładowania bibliotek współdzielonych a bibliotek statycznych
- 3. Łączenie bibliotek statycznych
- 4. Łączenie bibliotek statycznych
- 5. Wyświetl listę aplikacji do otwierania określonego pliku
- 6. Budowanie OpenCV jako bibliotek statycznych
- 7. Łączenie bibliotek statycznych w iPhone SDK 3.0
- 8. Najlepsza praktyka w przypadku zależności bibliotek statycznych
- 9. Rozmiar statycznych bibliotek generowanych przez Xcode
- 10. Zawijanie plików w jednym pliku wykonywalnym
- 11. Jak osadzić zasoby w pliku wykonywalnym Rust?
- 12. Jak znaleźć ścieżkę do bibliotek DLL używanych przez bibliotekę available_output?
- 13. Kompilowanie statycznych bibliotek TagLib 1.6.3 dla Windows
- 14. Wyświetl listę wszystkich zainstalowanych aplikacji.
- 15. Wyświetl listę wszystkich właściwości obiektu
- 16. Uzyskiwanie wszystkich css używanych w pliku html
- 17. Jak uzyskać nazwy bibliotek DLL używanych przez aplikację
- 18. przy użyciu gotowych bibliotek statycznych do projektowania NDK dla Androida
- 19. Wyświetl listę obsługiwanych walut w iOS
- 20. Wyświetl listę wszystkich testów w projekcie Django
- 21. Wyświetl listę wszystkich elementów w tablicy JavaScript
- 22. Wyświetl listę aktywnych PendingIntents w aplikacji AlarmManager
- 23. Wyświetl listę plików w Cloud Storage (Java)
- 24. Przechowywanie często używanych danych w pliku zamiast MySQL
- 25. Jak utworzyć automatyczną listę elementów używanych w dokumencie LaTeX?
- 26. Jak uzyskać listę pakietów używanych w dokumencie knitr .Rnw?
- 27. Jak uzyskać listę wszystkich tras używanych w aplikacji Sinatra?
- 28. W jaki sposób kod jest przechowywany w pliku wykonywalnym?
- 29. Samodzielne usuwanie aplikacji w języku C# w jednym pliku wykonywalnym
- 30. Łączenie statycznych wersji bibliotek Boost przy użyciu CMake
Jak @Goz i anon wskazują, działa to tylko wtedy, gdy plik binarny nie został usunięty/zawiera informacje o debugowaniu. Nazwy nie są konieczne (i nie są nawet używane) po połączeniu biblioteki statycznej z aplikacją - wszystkie połączenia odbywają się według adresu. –
To nie odpowiada na pytanie. "uruchamianie nm względem tych bibliotek" nie jest możliwe, jeśli nie znasz bibliotek; i są biblioteki używane pośrednio w łączeniu. – kavadias
Jeśli jest to nieznany plik binarny, nie wiemy, jakie biblioteki są obecne. Zatem "uciekanie się do tych bibliotek" brzmi samobójczo. – goldenmean