Czy adresy funkcji z bibliotek są stałe? [Ubuntu]

0

Witam.

W prostej aplikacji pobrałem adres funkcji pthread_exit i wyświetliłem go w konsoli:

Adres był taki:
0x80484C

Domyślam się, że to jest adres do miejsca w pamięci gdzie dopiero tam następuje skok do funkcji z biblioteki pthread

W debugerze skoczyłem do tego adresu (0x80484C) i na tym adresie jest skok do adresu 0x0804A004 (wg. mnie jest to prawdziwa funkcja pthread_exit?)

I mam pytanie: czy ten adres funkcji(0x0804A004) jest stały w każdym procesie? I czy ta funkcja występuje na większości procesów napisanych na linuxa?

Pozdrawiam.

0

Jak na moje nie, ale nie wiem. Przetestuj. Odpal parę procesów i sprawdz, potem zrestartuj kompa i sprawdz jeszcze raz. Nie sądzę by była w większości procesów, ale pewnie będzie w procesach, które używają wątków.

0

No właśnie, testowałem na 2 procesach, na swoim i innym(A dokładnie na debugerze pod linuxa), i skoczyłem tam do tego adresu i inaczej tam wyglądał kod.

Wszystko to samo robiłem na windowsie na funkcji ExitThread, i tam było wszystko ok(stały adres).

jeszcze poprzeglądam kilka procesów, jakąś wielowątkową aplikacje.

0

pod windows biblioteki mają wkompilowany adres bazowy, który sugeruje systemowi miejsce załadowanie biblioteki. jeśli jednak pod takim adresem już siedzi jakaś biblioteka, to system ładuje nową w inne miejsce. do tego nowa wersja biblioteki może zawierać nową wartość adresu bazowego...
tak więc pod windows nie możesz liczyć na ten sam adres (choć przeważnie będzie taki sam) - dlatego przy ładowaniu programu imageloader "podaje" programowi jakie są adresy funkcji importowanych z bibliotek.
pod linuksem jest pewnie podobnie, adres funkcji zostaje "wstrzyknięty" do programu z zewnątrz, przez systemowego loadera, ale tu tylko zgaduję. sprawdź adres po restarcie, a najlepiej sprawdź go na innym komputerze.

0

Adresy funkcji są "wstrzykiwane" przez loadera zarówno w linie, jak i winie. Jeśli w importach jest funkcja x z biblioteki y, to w pliku znajduje się instrukcja "JMP identyfikator x". Każde odwołanie do funkcji x to w rzeczywistości odwołanie do tego miejsca gdzie jest ten "JMP". Podczas ładowania "identyfikator x" jest zamieniany na aktualny adres x.

Można to też robić samemu ręcznie, dynamicznie, np tak: https://thunked.org/programming/calling-functions-without-importing-them-t31.html

0

Hm, czyli adresy funkcji z bibliotek nie są stałe : / Chciałem różnym wątkom w różnych procesach na różnych komputerach wywoływać adres funkcji bez obliczania adresu.

0

...a teraz przekonaj mnie, że nie usiłujesz sklecić exploita, z marnym skutkiem zresztą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1