2011-08-31 119 views
2

我正在努力获得用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。

感谢您给我的任何帮助。

+0

'long'的大小是实现定义的,所以不能保证长度为8字节。 –

回答

3

也许这与在file_a.c编译单元中不声明rb_helper_function_foo一样简单 - 因此编译器假定它返回的是int而不是VALUE?

+0

修正了它。谢谢! – keithepley