C extension: R_X86_64_32 problem when inlcuding a xxxxx.a library (64 bits SO)

Hi, I must include a header (udns.h) and library (libudns.a) in a Ruby
C extension (Linux 64 bits).

In extconf.rb I set:

have_library(“udns”)

“ruby extconf” creates the Makefile:

checking for main() in -ludns… yes
creating Makefile

but “make” command fails:

gcc -I. -I/usr/include/ruby-1.9.1/x86_64-linux
-I/usr/include/ruby-1.9.1/ruby/backward -I/usr/include/ruby-1.9.1 -I.
-fPIC -fno-strict-aliasing -g -g -O2 -fPIC -o em_udns.o -c em_udns.c
gcc -shared -o em_udns.so em_udns.o -L. -L/usr/lib -L. -rdynamic
-Wl,-export-dynamic -lruby-1.9.1 -ludns -lpthread -lrt -ldl -lcrypt
-lm -lc
/usr/bin/ld: ./libudns.a(udns_resolver.o): relocation R_X86_64_32
against `dns_defctx’ can not be used when making a shared object;
recompile with -fPIC
./libudns.a: could not read symbols: Bad value
collect2: ld returned 1 exit status

I know that “relocation R_X86_64_32” issue occurs with some libraries
in 64 bits and -fPIC is required. However AFAIK the above gcc command
does include -fPIC, am I right?

Anyhow, I can compile a pure C file (no Ruby) in a folder with these
files:

  • play1.c
  • udns.h
  • libudns.a
    by running: gcc play1.c -L. -ludns libudns.a -o play1

And the resulting “play1” executable works ok.

libudns.a has been compiled with library provided “configure”, and its
Makefile does contain -fPIC option:

PICFLAGS = -fPIC
[…]
.c.lo:
$(CC) $(CFLAGS) $(PICFLAGS) $(CDEFS) -o [email protected] -c $<

2011/2/5 Iñaki Baz C. [email protected]:

Hi, I must include a header (udns.h) and library (libudns.a) in a Ruby
C extension (Linux 64 bits).

In extconf.rb I set:

have_library(“udns”)

I must add that if I install the Debian/Ubuntu package libudns-dev
(which install both a dynamic libudns.so and a static libudns.a) then
my Ruby C extension compiles correctly.

On Sun, 6 Feb 2011 06:38:26 +0900
Iñaki Baz C. [email protected] wrote:

my Ruby C extension compiles correctly.

Try ‘-fPIC -DPIC’.

regards
ralf

2011/2/7 Ralf M. [email protected]:

Try ‘-fPIC -DPIC’.

Same error even if I’ve tryed that in the Makefile of libudns.a and
also in the Ruby extension Makefile. Same output as before (but now
with -DPIC):

gcc -I. -I/usr/include/ruby-1.9.1/x86_64-linux
-I/usr/include/ruby-1.9.1/ruby/backward -I/usr/include/ruby-1.9.1 -I.
-fPIC -DPIC -fno-strict-aliasing -g -g -O2 -fPIC -DPIC -o em-udns.o
-c em-udns.c
gcc -shared -o em_udns_ext.so em-udns.o -L. -L/usr/lib -L. -rdynamic
-Wl,-export-dynamic -lruby-1.9.1 -ludns -lpthread -lrt -ldl -lcrypt
-lm -lc
/usr/bin/ld: ./libudns.a(udns_resolver.o): relocation R_X86_64_32
against `dns_defctx’ can not be used when making a shared object;
recompile with -fPIC
./libudns.a: could not read symbols: Bad value

Thanks.

2011/2/7 Peter Z. [email protected]:

Empty body :slight_smile:

2011/2/7 Peter Z. [email protected]:

I was asking if you can post your code somewhere so we can get
hands on it instead of blindly guessing.

Ok, I’ll try to reduce my code and show it. Let me some time to do it.

Thanks.

On Mon, 7 Feb 2011 21:52:18 +0900
Iñaki Baz C. [email protected] wrote:

2011/2/7 Peter Z. [email protected]:

Empty body :slight_smile:

Oh, sorry. That happens somehow. I hope that mailman upgrade will fix
it. I was asking if you can post your code somewhere so we can get
hands on it instead of blindly guessing.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs