Jak przechowywać i wywoływać skompilowaną funkcję w C / C ++?

Dla celów optymalizacji na bardzo niskim poziomie przydatne byłoby dla mnie, gdybym mógł przechowywać skompilowaną funkcję bezpośrednio w zmiennej,nie wskaźnik do funkcji. Oznacza to, że jeśli mam funkcję foo, chcę, aby bufor char był wystarczająco duży, aby pomieścić instrukcje maszynowe wygenerowane dla foo, a następnie móc wywołać foo w jakiś sposób mówiąc C, aby przeskoczył do zawartości tego bufora (załóżmy, że mam wbudowany kompilator, aby upewnić się, że bufor char jest odpowiednio wyrównany dla mojej architektury). W idealnej sytuacji chciałbym to zrobić, utrzymując użycie zespołu na minimalnym poziomie (zdaję sobie sprawę, że niektóre mogą być wymagane).

Moim najlepszym rozwiązaniem do tej pory byłoby skompilowanie programu, który ma tylko funkcję, którą chcę zgromadzić za pomocą GCC, a następnie skompilowanie do kodu maszynowego, a następnie użycie adresów z wyprowadzonego zespołu do wyodrębnienia żądanego kodu maszynowego z pliku wykonywalnego, a następnie ręczne wypełnienie bufor z tym w moim programie, a następnie użyj zestawu inline, aby przeskoczyć do adresu początkowego bufora. To bardziej hackish i manualna praca niż bym chciała.

Nie muszę kompilować nowych funkcji w czasie wykonywania, wystarczy, że bufor zawiera instrukcje odpowiadające różnym już skompilowanym funkcjom podczas wykonywania. Na przykład. Mogę mieć 3 skompilowane funkcje i 1 bufor. 3 funkcje są znane w czasie kompilacji, ale w czasie wykonywania bufor może odpowiadać dowolnemu z 3 w różnych momentach.

Edycja: Aby wyjaśnić, co byłoby zyskać: Mam strukturę, której ten bufor będzie członkiem, i różne wskaźniki do instancji tej struktury. Bufor każdej struktury może zawierać inną skompilowaną funkcję. Gdybym używał wskaźnika funkcji zamiast bufora, musiałbym załadować wskaźnik funkcji struktury, a następnie usunąć wskaźnik funkcji. Z buforem mogę po prostu przeskoczyć licznik programu do przesunięcia (względna lokalizacja bufora) podstawy struktury. To jeden mniejszy poziom orientacji. W przypadku bardzo małych funkcji może to być oszczędność.

Edytuj 2: Dalsze wyjaśnienie:

Ze wskaźnikiem funkcji:

Wczytaj wskaźnik z & struct + offsetof (pointer)Przejdź do lokalizacji zawartej w wskaźniku

Z buforem zawierającym kod maszynowy:

Przejdź do & struct + offsetof (bufor)

Drugi to mniej kroków.

questionAnswers(12)

yourAnswerToTheQuestion