Вызов загруженного вручную кода (AT & T + C) (g ++) - PullRequest
1 голос
/ 10 сентября 2010

Я реализую программу, которая загружает чистый код из файла и вызывает первую инструкцию. Независимо от того, что я делаю, я получаю ошибку сегментации, когда выполняется моя инструкция вызова. Что я делаю не так?

char code[65536];
...
__asm__("movl code, %eax");
__asm__("call *%eax");

Ответы [ 4 ]

1 голос
/ 10 сентября 2010

Для выполнения сгенерированного кода - он должен находиться в исполняемом разделе.

На x86-64 попробуйте это вместо

char* code = mmap(0, 1024 * 1024, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_32BIT | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);

в 32-битной системе map_32bit не имеет значения (он используется на x86-64, чтобы убедиться, что код может войти в первые 2 ГБ и использовать относительную адресацию)

1 голос
/ 10 сентября 2010

совместим ли "чистый код" с вашей программой?Какая ОС?«обычно» «чистый код» перемещается и «перемещается» на соответствующий адрес в памяти с помощью «загрузчика связей», который выполняет соответствующие настройки.

0 голосов
/ 10 сентября 2010

Проверьте значения стека с помощью отладчика при возврате из импортированного кода и дважды проверьте, что он содержит действительный адрес возврата. Как называется ваш импортированный код? Вы нажимаете какие-либо значения перед вызовом импортированного кода и корректирует ли импортированный код стек в конце?

0 голосов
/ 10 сентября 2010

ОС - это Linux Ubuntu.

Я знаю, что обычно это делается так.Код совместим, он от моего собственного компилятора, который генерирует файл только с программным кодом, и первая инструкция в файле является первой инструкцией основного метода.

(я студент, и я долженделай это вручную, чтобы я чему-то научился! ;-) =

...