Witam. Czy w C mogę załadować funkcje pod konkretny wskazany adres w pamięci? I potem ja wywoływać z pod tego adresu po przez wskaźnik na funkcję. Temu się pytam, skoro istnieją wskaźniki na funkcje to czemu by funkcji samemu nie zalokować w pamięci.
Temu, aby nie trafić w adresację innego programu. Tym zarządza system operacyjny.
Nie da się bezpośrednio z kodu tego zrobć. Musiałbyś taką funkcję najpierw skompilować i wyszukać w pliku *.dll lub *.exe jej binarnej treści, albo używając assembly napisać i skompilować do pliku obiektowego. Dopiero taki plik mógłbyć teoretycznie wrzucić do pamięci, ale chyba fopen tego nie zrobi, bo pamięć musi być na ten plik zaalokowana w sekcji read-write-executable. I wtedy mógłbyć przypisac adres tego pliku do wskażnika na funkcję i próbować to wywołać
Jednym słowem teoretycznie się da, ale nie przez mechanizmy języka. Nie przychodzi mi też praktyczne zastosowanie ładowania funkcji pod konkretny adres
Chyba nie zrozumiałeś co napisałem. Nie ma nic o nadpisaniu pamięci, ale jeśli on sobie wpisze, że chce zaalokować coś w komórce pod adresem powiedzmy 0xFFFFFFFF, to jaką ma pewność, że to nie spowoduje naruszenia ochrony pamięci (np. SEGFAULT w Linux). Słaby to program co raz działa, a raz rzuca błędem i kończy działanie.
Polecam zainteresować się budową i sposobem działania kompilatorów JIT, które kompilują kod w locie i wstrzykują go w pamięć.
Pisze pod linuxem, a konkretniej moduł do jądra 3.14 stable. Potrzebuje pare funkcji wepchac do pamieci aby potem móc je wywoływać przez inne programy uruchomione z poziomu konsoli.
Zakładam, że autorowi chodzi o wstrzyknięcie pod konkretny adres ale zaalokowany wcześniej przez własny proces.
@OP
Nie będziesz mógł wywołać funkcji jednego programu z poziomu drugiego. Od tego są dynamicznie linkowane biblioteki.
Jak chcesz zaalokować konkretny adres? Przecież jeśli on już będzie zaalokowany, to dostaniesz SEGFAULT. Przykładowo ty i ja piszemy programy i oba mają nie istniejąca instrukcję alloc_cell(0xFFFFFFFF), wygra ten, który będzie pierwszy, drugi dostanie SEGFAULT. To nie ma sensu - o to mi cały czas chodzi.
A nie lepiej zrobić jakąś bibliotekę?
Więc co musze zrobic aby z modułu kernela udostępniać funkcje innym pragramą?
Czy ten moduł to jakaś biblioteka?
Hmm. Normalny moduł dodawany przez insmod, takie “duże” hello word. Sam działa jako program a na dodatek udostępia swoje funkcje innym aplikacją
Więc moim zdaniem, nie będzie się tego dało zrobić sensownie, o ile obie strony nie są na to przygotowane. W zasadzie są dwie sensowne opcje:
- Napisać własny System call
- Porozumiewać się przy pomocy np. Netlink socket
Systemy z ochroną pamięci (SEGFAULT to naruszenie tejże ochrony pamięci) zazwyczaj dają różnym procesom osobne przestrzenie adresowe i dwa różne procesy mogą mieć w swoich pamięciach pod takim samym adresem różne rzeczy i nie wchodzić sobie w drogę
fedora24x , na forum piszemy w języku polskim, w związku z tym należy korzystać z polskich znaków diakrytycznych (ą,ę,ć,ł,ń,ó,ś,ź,ż), proszę poprawić swój post oraz tytuł wątku, w przeciwnym razie temat zostanie przeniesiony do kosza.