Muszę wywołać funkcję w C, po prostu znając jej adres i brak informacji na jej prototypie (nie mogę przesłać go do wskaźnika funkcji C).Wywołanie adresu C jako funkcji bez prototypu
Informacje jakie mam na temat tej funkcji to adres.
Wiem również parametry, które chcę przekazać (dzięki pustej wskazówce) i wielkość tablicy argumentów (dostęp za pomocą pustego wskaźnika).
Pragnę również uszanować konwencję telefonowania C. W przypadku wersji x86, w zasadzie wiem, jak to zrobić (przydzielić przestrzeń na stosie, skopiuj parametry do tej przestrzeni i w końcu wywołaj funkcję).
Problem dotyczy konwencji x64 (na razie Linux), gdzie parametry przechodzą przez rejestry . Nie mam pojęcia o wielkości każdego parametru, aby odpowiednio wypełnić rejestry, znam tylko rozmiar tablicy parametrów.
Poza tym nie chcę polegać na gcc, więc nie mogę użyć __builtin_apply, która wydaje się być nietypowa, a także być całkiem ciemną.
Chcę napisać własny fragment kodu, aby obsługiwać wiele kompilatorów, a także dowiedzieć się ciekawych rzeczy.
Więc w zasadzie, funkcja Chcę napisać jako ten sam prototyp jako __builtin_apply która jest:
void *call_ptr(void (*fun)(), void *params, size_t size);
Chcę również kod napisać w C (dzięki asm inline) lub czystego x64 asm .
Czy istnieje sposób, aby zrobić to właściwie i zgodnie z konwencją wywołującą ? Czy jest to niemożliwe w konwencji x64 bez znajomości dokładnie prototypu funkcji o nazwie?
Zobacz [libffi] (http://sourceware.org/libffi/). – tangrs
To może być świetna alternatywa, ale problemem z libffi jest to, że musi znać typ każdego parametru i typ zwracanej funkcji. Chcę uniknąć gromadzenia tych informacji, aby w miarę możliwości uniknąć straty czasu. Czy to możliwe z architekturą x64? – Zerkan
@Zerkan nie, nie, potrzebujesz typów parametrów, nie ma magii, która umieściłaby parametry w odpowiednich rejestrach lub przestrzeni stosu podczas wywoływania funkcji bez znajomości argumentów. – nos