簡體   English   中英

Ruby 1.8.7:在C擴展中調用函數的Segfault

[英]Ruby 1.8.7: Segfault on calling function inside C extension

我正在為Ruby模塊構建一個簡單的C擴展,當我在擴展中調用另一個C函數時,我遇到了段錯誤。 基本的執行流程如下:

  1. 我創建了一個Ruby類並在其上調用了一個實例方法
  2. 在我的擴展中調用C方法
  3. 在一個單獨的文件中調用另一個C函數,但編譯好了

這是最后一次似乎打破的跳躍。 我已經能夠重現這個問題幾乎沒有任何功能,但函數調用。 我有一個標准的extconf.rb ,使用直接Make編譯它,並且在對encrypt()的調用上encrypt() segfaults。 在運行時,我發出以下命令:

$ ruby extconf.rb
$ make clean
$ make
$ ruby -r des -e 'puts DES.new.encrypt!'

輸出:

creating Makefile
/usr/bin/gcc-4.2 -I. -I/opt/local/lib/ruby/1.8/i686-darwin10 -I/opt/local/lib/ruby/1.8/i686-darwin10 -I. -I/opt/local/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE   -fno-common -std=c99 -arch x86_64 -c calc.c
/usr/bin/gcc-4.2 -I. -I/opt/local/lib/ruby/1.8/i686-darwin10 -I/opt/local/lib/ruby/1.8/i686-darwin10 -I. -I/opt/local/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE   -fno-common -std=c99 -arch x86_64 -c deslib.c
/usr/bin/gcc-4.2 -dynamic -bundle -undefined suppress -flat_namespace -o calc.bundle calc.o deslib.o -L. -L/opt/local/lib -L/opt/local/lib -L. -L/opt/local/lib -arch x86_64  -arch x86_64  -lruby  -lpthread -ldl -lobjc
About to do C encrypt...
./des.rb:42: [BUG] Segmentation fault
ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10]

zsh: abort      ruby -r des -e 'puts DES.new.encrypt!'

Ruby類:

class D
    def encrypt!
        self.encrypted = Calc.encrypt(0,0,0)
        return self.encrypted
    end
end

Calc模塊:

#include "ruby.h"
#include "cryptlib.h"

VALUE Calc = Qnil;
void Init_calc();

VALUE method_encrypt(VALUE self, VALUE m, VALUE k, VALUE n);

void Init_calc() {
    Calc = rb_define_module("Calc");
    rb_define_method(Calc, "encrypt", method_encrypt, 3);
}

VALUE method_encrypt(VALUE self, VALUE m, VALUE k, VALUE n) {
    uint64_t message = NUM2ULONG(m);
    uint64_t key = NUM2ULONG(k);
    int iters = NUM2INT(n);

    printf("About to do C encrypt...\n");
    uint64_t ciphertext = encrypt(message, key, iters);
    printf("Done with C encrypt\n");

    return ULONG2NUM(ciphertext);
}

cryptlib.h:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>

uint64_t encrypt(uint64_t message, uint64_t key, int iters);

cryptlib.c:

#include "cryptlib.h"

uint64_t encrypt(uint64_t message, uint64_t key, int iters) {
    return 0;
}

為什么這么糟糕? 我在不到一小時前從MacPorts編譯的MacBook Pro上運行ruby 1.8.7 (2011-02-18 patchlevel 334) [i686-darwin10] 我的gcc --versioni686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)

事實證明, encrypt函數名稱保留在Ruby C擴展庫中更高的位置。 重命名功能,一切正常。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM