Существует один (относительно) простой способ достижения этого, который называется «код, независимый от позиции».См. Документацию к вашему компилятору.
Это означает, что вы можете скомпилировать некоторые источники в двоичный файл, который будет выполняться независимо от того, где в адресном пространстве вы его разместите.Если у вас есть такой кусок двоичного кода x86 в файле и mmap (), то он (или эквивалент Windows) может быть вызван как из Linux, так и из Windows.
Уже упомянутые ограничения, конечно, все еще присутствуют- а именно, двоичный код должен ограничиваться использованием соглашения о вызовах, идентичного на обеих платформах / может быть представлено на обеих платформах (для 32-битной x86, которая будет передавать аргументы в стеке и возвращать значения в EAX), и, конечно,код должен быть полностью самодостаточным - никакие вызовы функций DLL не разрешаются, поскольку их решение зависит от системы.
Т.е.:
- Вам необходим независимый от позиции код
- Вы должны создать автономный код без каких-либо внешних зависимостей
- Вы должны извлечь машинный код из объектного файла.
Затем mmap () этот файл инициализироватьуказатель на функцию, и (* myblob) (someArgs) могут это сделать.
Если вы используете gcc, опции "-ffreestanding -nostdinc -fPIC" sдолжен дать вам большую часть того, что вы хотите в отношении первых двух, а затем использовать objdump для извлечения двоичного двоичного объекта из объектного файла ELF.