Ruby C扩展 - 被截断的64位指针导致段错误

时间:2011-08-31 20:40:51

标签: c ruby 64-bit segmentation-fault

我正努力尝试使用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。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:3)

也许这就像rb_helper_function_foo没有在file_a.c编译单元中声明一样简单 - 所以编译器假设它返回int而不是VALUE?