Mam interesującą sytuację w pracy, dla której próbuję znaleźć dobre rozwiązanie. Mamy kod, który działa na wielordzeniowym MIPS bare metal (bez jądra). Musimy zintegrować się z jakimś zewnętrznym kodem, który wymaga aktualizacji. Myślałem o skompilowaniu kodu strony trzeciej jako PIC, a następnie zmianie GOT dla symboli kodu/danych po pobraniu tego kodu (mam kontrolę nad tym, gdzie kod będzie rezydował). Załóżmy również, że interfejsy do kodu zewnętrznego nie zmieniają się, więc nie ma nowych wpisów PLT/GOT. Czy to działa ?. Jakie inne rzeczy powinienem wziąć pod uwagę?Emuluj dynamiczny program ładujący, aby naprawić korekcje bibliotek współdzielonych
Odpowiedz
Czy poprawna odpowiedź jest dłuższa niż "osadzić dynamiczny linker/loader"? Twój problem wydaje się taki sam jak rozwiązany przez ld.so i podobne. Opisanie wszystkich rzeczy, które musi rozważyć dynamiczny linker/loader, jest tematem książek takich jak: John Levine, takich jak Linkers and Loaders.
Szukam czegoś prostszego niż napisanie mojego wbudowanego programu ładującego. Przeczytałem książkę, o której wspomniałeś powyżej. Kiedy skończyłem pracę nad moim problemem, opublikuję, co zrobiłem. Dzięki!. – vamsi
Czy Linux/Unix binutils objcopy
będzie tym, czego szukasz. Zakładając, że budujesz wszystkie swoje pliki binarne naraz, a nie chcesz ich dynamicznie ładować w czasie wykonywania w przypadkowej kolejności [i nie masz wystarczająco dużo pamięci, aby je rozłożyć w tej pamięci], to myślę, że to zadziała.
Oczywiście, jeśli TYLKO potrzebujesz naprawić GOT, to nie widzę powodu, dla którego nie możesz tego zrobić - pisanie czegoś takiego nie jest trudne. Ale funkcja objcopy jest już napisana i może wykonać całkiem sporo binarnego/wykonywalnego "rozmyślania" (użyłem go do tworzenia boot-romów dla różnych systemów, w tym dla ROM-ów z BIOS-u na PC i tym podobne) [Nie, żebym wymyślił z tym pomysłem, bardziej jak wziąłem czyjś plik makefile, który miał w sobie objcopy - po prostu przyjrzałem się temu, co zrobił, aby zrozumieć, jak to się stało, gdy coś w tym punkcie się nie powiodło]
- 1. Makefile dla bibliotek współdzielonych?
- 2. Czas ładowania bibliotek współdzielonych a bibliotek statycznych
- 3. Zależności bibliotek współdzielonych z distutils
- 4. Sprawdzanie bibliotek współdzielonych dla domyślnych programów ładujących
- 5. Tworzenie bibliotek współdzielonych w C++ dla OSX
- 6. Błąd Cygwin Gcc podczas ładowania bibliotek współdzielonych?
- 7. błąd podczas ładowania bibliotek współdzielonych: libgomp.so.1:, nieprawidłowa wersja GCC?
- 8. Animowany program ładujący, taki jak Snapchat
- 9. Jak działa program ładujący Raspberry Pi?
- 10. Program ładujący aplikacji ERROR ITMS-90062
- 11. SQL * Program ładujący nie rozpoznaje ogranicznika "¥"
- 12. Program ładujący początkowy WCF rejestrujący wiele usług
- 13. Budowanie bibliotek statycznych i współdzielonych dla LLVM libC++ 3.3
- 14. LD_PRELOAD odpowiednik dla systemu Windows do wstępnego ładowania bibliotek współdzielonych
- 15. Jaki jest najlepszy sposób udostępnienia bibliotek współdzielonych wielu aplikacjom?
- 16. Jak mogę sprawdzić uruchomiony proces, aby zobaczyć, z jakich bibliotek współdzielonych korzysta?
- 17. Czy mogę, aby gcc ignorowało statyczne biblioteki podczas łączenia bibliotek współdzielonych?
- 18. Program ładujący aplikacji: "Nie znaleziono żadnych kwalifikujących się aplikacji."
- 19. Jak ustawić niestandardowy program ładujący klasy jako domyślny?
- 20. Jak program Proguard ignorować bibliotek zewnętrznych?
- 21. program ładujący reagowanie i pakiet WWW. "czekam, aż korzenie się załadują ... aby przeładować inspektora"
- 22. Asynchroniczny program ładujący obraz w widoku listy [Android]
- 23. Bardzo spowalniające ładowanie aplikacji/błąd komunikacji - program ładujący
- 24. Uniwersalny program ładujący obrazy - ręczne czyszczenie pamięci podręcznej
- 25. Jak zarejestrować inny (niestandardowy) program ładujący Twig w środowisku Symfony2?
- 26. Program ładujący aplikacji czeka i połączenie sieciowe zostało utracone
- 27. Ręczne aktualizowanie atrybutów zainstalowanych przez program ładujący Carrierwave
- 28. błąd podczas ładowania bibliotek współdzielonych: libevent-1.4.so.2: nie można otworzyć pliku obiektu współdzielonego:
- 29. Emuluj plik hosts na niezrootowanym Androidzie
- 30. Android NDK - tworzenie dwóch natywnych bibliotek współdzielonych, które wywołują się nawzajem
Muszę powiedzmy, podczas gdy myślę, że płynie w bardzo głębokim końcu bardzo umiejscowionego pytania, po prostu nie mogę zmusić się do głosowania w dół (i w rzeczywistości zamiast tego głosować w górę), ponieważ jest to po prostu zbyt cholernie intrygujące Pomysł i ciekawość wyniosły mnie (i podobno także innych). Powodzenia! – WhozCraig
@vamsi Pytanie jest dla mnie nieco niejasne. Czy chodzi ci o zmianę GOTa przy każdym załadowaniu nowej wersji 3rd party (upgrade)? Pytasz, jak samemu napisać ładowarkę? – selalerer
@selalerer Tak, chodzi mi o zmianę GOTa za każdym razem, gdy ładuję nową wersję 3rd party. Tak, w gruncie rzeczy to, co miałbym mieć, to lekki ładowacz. Nie chcę zaimplementować pełnowymiarowego programu ładującego. Wszystko, co chcę zrobić, to naprawić tabele GOT/PLT i uzyskać nowy kod aktywny. – vamsi