Как изменить файл 'jonesforth.S', чтобы он мог вернуться к функции вызывающей стороны C, не вызывая ошибку сегментации? - PullRequest
0 голосов
/ 02 декабря 2018

Как изменить файл jonesforth.S, чтобы он мог вернуться к функции вызывающего абонента C, не вызывая ошибки сегментации?

https://www.facebook.com/groups/483887212122959/permalink/509343602910653/

https://github.com/udexon/5CSM/blob/master/Progress_20181202.md

(1) Главное открытие, сделанное со времени последнего отчета, заключается в том, что вызов syscall __NR_BRK_ вызовет ошибку сегментации ПОСЛЕ возврата из _start1 (jonesforth) к функции вызывающей стороны C (main()).

Таким образом, этиизменения сделаны в jonesforth9e.S:

i.Отключить вызов set_up_data_segment (строка 583).

ii.Замените (i) на C malloc (char *) FDSEG (четвертый сегмент данных), чтобы определить var_HERE (строка 575).

iii.Это решило одну проблему, но не решило другую:

a.кот jonesforth.f df |jonesforth9e теперь работает.Файл jonesforth.f можно загрузить с помощью FDSEG, заменив set_up_data_segment.

b.кошка jonesforth.f cf |jonesforth9e по-прежнему не работает, вызывая ошибку сегментации.

Чтобы скомпилировать вышеуказанное: gcc -m32 -o sj9e sj.c jonesforth9e.S -g array.s

Файлы сценариев Forth: cfdf

cf содержит новое слово Forth, RET, которое я создал - чтобы вернуться к функции вызывающей стороны C.В противном случае jonesforth выйдет через системный вызов __NR_exit.После возврата к вызывающей функции C (main ()) из jonesforth (проверено с помощью gdb) произошла ошибка seg при вызове printf (строка 62 в файле sj.c).

1 Ответ

0 голосов
/ 10 декабря 2018

Предварительное решение приведено здесь:

https://github.com/udexon/5CSM/blob/master/Progress_20181203.md

TLDR: поместите jonesforth в функцию обертки C.Пусть GCC обрабатывает стек.

Нужно больше времени, чтобы найти решение без ошибок.

...