Czy w C mogę załadować funkcje pod konkretny wskazany adres w pamięci?

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ć :stuck_out_tongue:

 

Jednym słowem teoretycznie się da, ale nie przez mechanizmy języka. Nie przychodzi mi też praktyczne zastosowanie ładowania funkcji pod konkretny adres :stuck_out_tongue:

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.

@michal_93

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ę :stuck_out_tongue:

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.