2012-11-16 11 views
11

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

+1

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

+0

@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

+0

@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

Odpowiedz

1

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.

+1

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

0

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]