Как изменить файл 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).