如何修改文件“ jonesforth.S”,使其可以返回到C调用者函数而不会引起分段错误?

时间:2018-12-02 11:48:12

标签: c gcc assembly x86 forth

如何修改文件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行)时发生了段错误。

1 个答案:

答案 0 :(得分:1)

在这里给出一个临时的解决方案:

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

TLDR:将jonesforth放入C包装函数中。让GCC处理堆栈。

需要更多时间找出无错误的解决方案。