如何修改文件jonesforth.S
,使其可以返回C调用者函数而不会引起分段错误?
https://www.facebook.com/groups/483887212122959/permalink/509343602910653/
https://github.com/udexon/5CSM/blob/master/Progress_20181202.md
(1)自上次报告以来的主要发现是,在从_start1(jonesforth)返回到C调用者函数(main()
)之后,调用syscall __NR_BRK_将导致分段错误。
因此,这些更改是在jonesforth9e.S
中进行的:
i。禁用呼叫set_up_data_segment(第583行)。
ii。将(i)替换为C malloc(char *)FDSEG(第四数据段)以定义var_HERE(第575行)。
iii。这样做解决了一个问题,但又解决了另一个问题:
a。猫jonesforth.f d.f | jonesforth9e现在可以工作。可以用FDSEG加载jonesforth.f来代替set_up_data_segment。
b。猫jonesforth.f c.f | jonesforth9e仍然无法正常工作,出现了分段错误。
要编译以上代码:gcc -m32 -o sj9e sj.c jonesforth9e.S -g array.s
第四个脚本文件:c.f d.f
c.f包含我创建的一个新的Forth单词RET,以返回到C调用者函数。否则,jonesforth将通过系统调用__NR_exit退出。从jonesforth(用gdb验证)返回到C调用者函数(main())后,调用printf
(文件sj.c中的第62行)时发生了段错误。
答案 0 :(得分:1)
在这里给出一个临时的解决方案:
https://github.com/udexon/5CSM/blob/master/Progress_20181203.md
TLDR:将jonesforth放入C包装函数中。让GCC处理堆栈。
需要更多时间找出无错误的解决方案。