X86_64 segmentation fault due to forgotten extern directive

Hello, I have been tracking down a segmentation fault that only appeared
on a x86_64 64 bit linux machine and was finally able to catch the
bastard. I'm not sure it is a bug (it looks more like bad coding
practice from my side), but it might be interesting for other people
experiencing the same problems.

I created a toy example that shows the essence: I have a ruby program
(test.rb) that calls a C function "cf_test" which was added to the class
String. This C function is defined in test.c and calls another C
function (localFunction) that is contained in another .c file (test2.c)
and thus also in another object file (test2.o). Finally, "compile"
contains the compilation instructions I used for compiling all this.

Ruby generates a segmentation fault when I omit the "extern" directive
on line 2 of test.c. I guess it is bad practice to omit this, but I got
no errors when I compiled test.c or linked test.o and test2.o together
to generate the shared object file test.so. For some strange reason,
this does not cause any problems on a 32 bit machine, I only found out
about it when I tried to port everything to a x86_64 machine

I hope this can be useful for someone,

Greetings,

Geert.

***test.rb***

require './test.so'

a='abc'.cf_test

puts a.class

***test.c***

#include "ruby.h"

extern VALUE localFunction(char*);//THIS IS A CRITICAL LINE ON x86_64

VALUE f_test(VALUE self)

{

  return localFunction(RSTRING(self)->ptr);

}

VALUE cString;

void Init_test()

{

  cString=rb_define_class("String",rb_cObject);

  rb_define_method(cString,"cf_test",f_test,0);

}

***test2.c***

#include "ruby.h"

VALUE localFunction(char *pch)

{

  return rb_str_new2(pch);

}

***compile***

#!/bin/bash

gcc -fpic -c test2.c -I/usr/local/lib/ruby/1.9/x86_64-linux

gcc -fpic -c test.c -I/usr/local/lib/ruby/1.9/x86_64-linux

gcc -shared test.o test2.o -o test.so

to generate the shared object file test.so. For some strange reason,
this does not cause any problems on a 32 bit machine, I only found out
about it when I tried to port everything to a x86_64 machine

Normal, on 32 bit machine sizeof(int) == sizeof(unsigned long). This is
not the case on x86_64

Guy Decoux