我正在努力获得用c写的ruby扩展,在Mac OSX上使用ruby 1.9.2。由于函数返回的64位指针被截断为32位值,并试图访问低内存,我一直在收到一段错误。Ruby C扩展 - 64位指针被截断导致段错误
下面是我对它的了解。 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个字节%獭兔的被复制。
我在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。
感谢您给我的任何帮助。
'long'的大小是实现定义的,所以不能保证长度为8字节。 –