Issue #5147 has been updated by Naohisa Goto.


After r32902, in sparc64-solaris2.10, when configuring with no --enable-shared, linker error occurred during linking shared object ext/-test-/array/resize.so.

 linking shared-object -test-/array/resize.so
 ld: fatal: relocation error: R_SPARC_H44: file ../../../../libruby-static.a(array.o): symbol rb_cFixnum: relocations based on the ABS44 coding model can not be used in building a shared object
 make[2]: *** [../../../../.ext/sparc64-solaris2.10/-test-/array/resize.so] Error 1

In IRC #ruby-ja, k_tsj reported similar error occurred on Ubuntu 10.4 x86_64.

 /usr/bin/ld: ../../../libruby-static.a(class.o): relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
 ../../../libruby-static.a: could not read symbols: Bad value

Please revert r32902.
Related changeset is r3138.
----------------------------------------
Bug #5147: mkmf should not require static library when ruby is built with --enable-shared
http://redmine.ruby-lang.org/issues/5147

Author: Vit Ondruch
Status: Closed
Priority: Normal
Assignee: Nobuyoshi Nakada
Category: 
Target version: 1.9.3
ruby -v: -


If libruby-static.a library is not present on the system, the following simple mkmf example fails:

$ ruby -r mkmf -e 'exit(have_func("rb_hash_foreach") ? 0 : 1)'
checking for rb_hash_foreach()... /usr/lib64/ruby/1.9.1/mkmf.rb:381:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.
	from /usr/lib64/ruby/1.9.1/mkmf.rb:460:in `try_link0'
	from /usr/lib64/ruby/1.9.1/mkmf.rb:475:in `try_link'
	from /usr/lib64/ruby/1.9.1/mkmf.rb:618:in `try_func'
	from /usr/lib64/ruby/1.9.1/mkmf.rb:893:in `block in have_func'
	from /usr/lib64/ruby/1.9.1/mkmf.rb:789:in `block in checking_for'
	from /usr/lib64/ruby/1.9.1/mkmf.rb:284:in `block (2 levels) in postpone'
	from /usr/lib64/ruby/1.9.1/mkmf.rb:254:in `open'
	from /usr/lib64/ruby/1.9.1/mkmf.rb:284:in `block in postpone'
	from /usr/lib64/ruby/1.9.1/mkmf.rb:254:in `open'
	from /usr/lib64/ruby/1.9.1/mkmf.rb:280:in `postpone'
	from /usr/lib64/ruby/1.9.1/mkmf.rb:788:in `checking_for'
	from /usr/lib64/ruby/1.9.1/mkmf.rb:892:in `have_func'
	from -e:1:in `<main>'

The example tries to execute the following command which fails:

$ gcc -o conftest -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.    -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -mtune=generic -m64 -fPIC conftest.c  -L. -L/usr/lib64 -L. -Wl,-z,relro -m64 -rdynamic -Wl,-export-dynamic  -m64   -lruby-static  -lpthread -lrt -ldl -lcrypt -lm   -lc
/usr/bin/ld: cannot find -lruby-static
collect2: ld returned 1 exit status

I omitted the static library since it was never needed on Fedora for Ruby 1.8 and never included in default installation. Inclusion of static library is against Fedora guidelines [1]. I would be very happy if this could be fixed prior Ruby 1.9.3 release.



[1] http://fedoraproject.org/wiki/Packaging:Guidelines#Packaging_Static_Libraries


-- 
http://redmine.ruby-lang.org