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 $@ -c $<
-------------------------------------------------
I'm a bit lost here, any help please?
--
Iñaki Baz Castillo
<ibc@aliax.net>
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.
···
2011/2/5 Iñaki Baz Castillo <ibc@aliax.net>:
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ñaki Baz Castillo
<ibc@aliax.net>
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 Ralf Mueller <ralf.mueller@zmaw.de>:
Try '-fPIC -DPIC'.
--
Iñaki Baz Castillo
<ibc@aliax.net>
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.
···
On Mon, 7 Feb 2011 21:52:18 +0900 Iñaki Baz Castillo <ibc@aliax.net> wrote:
2011/2/7 Peter Zotov <whitequark@whitequark.org>:
Empty body 
--
WBR, Peter Zotov
Ok, I'll try to reduce my code and show it. Let me some time to do it.
Thanks.
···
2011/2/7 Peter Zotov <whitequark@whitequark.org>:
I was asking if you can post your code somewhere so we can get
hands on it instead of blindly guessing.
--
Iñaki Baz Castillo
<ibc@aliax.net>