我正努力尝试使用c编写的ruby扩展,在Mac OSX上使用ruby 1.9.2。我一直得到一个由一个64位指针引起的段错误,该指针从被截断为32位值的函数返回并尝试访问低内存。
这是我已经弄明白的事情。 VALUE是一个很长的,在ruby源代码中定义,代码不会编译,除非sizeof(long)是8个字节。
在file_b.c中:
VALUE
rb_helper_function_foo(VALUE file)
{
VALUE blah;
...
//Using gdb, blah right here is a 64bit address, ex: 0x1 009d 62a0
return blah;
}
在file_a.c
中VALUE
func_do_stuff(int argc, VALUE *argv, VALUE obj)
{
VALUE filename, file_path;
...
// But here, the size of what is returned is 4 bytes
// file_path has a size of 8 bytes though
file_path = rb_helper_function_foo(filename);
//This statement will segfault :-(
if(!RTEST(file_path))
{
...
}
...
}
在函数调用结束时,返回值具有正确的地址,但只返回低4字节:0x009d52a0而不是0x1009d52a0。访问低内存地址会导致段错误。
在返回期间调用的汇编代码中,有这条指令
movslq %eax, %r12
只复制较低的4个字节,但我需要复制所有8个字节的%rax。
关于ruby 1.9.2-p290(尽管它与p180的相同),Mac OSX 10.6.8,使用xcode 4.0.1(使用gcc 4.2.1),但我也尝试升级到gcc 4.6.1。它之前也尝试过xcode 3.2。
感谢您提供任何帮助。
答案 0 :(得分:3)
也许这就像rb_helper_function_foo
没有在file_a.c编译单元中声明一样简单 - 所以编译器假设它返回int而不是VALUE?