Bug #5147

mkmf should not require static library when ruby is built with --enable-shared

Added by Vit Ondruch over 2 years ago. Updated over 2 years ago.

[ruby-core:<unknown>]
Status:Closed
Priority:High
Assignee:Nobuyoshi Nakada
Category:-
Target version:1.9.3
ruby -v:- Backport:

Description

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

$ ruby -r mkmf -e 'exit(havefunc("rbhashforeach") ? 0 : 1)'
checking for rb
hashforeach()... /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
tryfunc'
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
'

The example tries to execute the following command which fails:

$ gcc -o conftest -I/usr/include/ruby-1.9.1/x8664-linux -I/usr/include/ruby-1.9.1/ruby/backward -I/usr/include/ruby-1.9.1 -I. -O2 -g -pipe -Wall -Wp,-DFORTIFY_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

Associated revisions

Revision 32833
Added by Nobuyoshi Nakada over 2 years ago

  • lib/mkmf.rb (link_command): use static library only for bundled extensions. [Bug #5147]

Revision 32902
Added by Nobuyoshi Nakada over 2 years ago

  • lib/mkmf.rb (init_mkmf): set $LIBRUBYARG regardless of shared option. [Bug #5147]

Revision 32927
Added by Nobuyoshi Nakada over 2 years ago

  • lib/mkmf.rb (link_command): use LIBRUBYARG in rbconfig for unbundled extensions. [Bug #5147]
  • lib/mkmf.rb (init_mkmf): revert r32902.

History

#1 Updated by Nobuyoshi Nakada over 2 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r32833.
Vit, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • lib/mkmf.rb (link_command): use static library only for bundled extensions. [Bug #5147]

#2 Updated by Eric Wong over 2 years ago

I've bisected r32833 to breaking many of my external C extension builds:

$ ruby -rmkmf -e 'p havefunc("rbstrsetlen")'
checking for rbstrset_len()... no
false

#3 Updated by Motohiro KOSAKI over 2 years ago

  • Status changed from Closed to Assigned
  • Assignee set to Nobuyoshi Nakada
  • Target version set to 1.9.3

I've bisected r32833 to breaking many of my external C extension builds:

$ ruby -rmkmf -e 'p havefunc("rbstrsetlen")'
checking for rbstrset_len()... no
false

Nobu? please answer this.

#4 Updated by Nobuyoshi Nakada over 2 years ago

  • ruby -v changed from ruby 1.9.3dev (2011-07-31 revision 32789) [x86_64-linux] to -

Hi,

At Fri, 5 Aug 2011 08:26:59 +0900,
Eric Wong wrote in :

I've bisected r32833 to breaking many of my external C extension builds:

$ ruby -rmkmf -e 'p havefunc("rbstrsetlen")'
checking for rbstrset_len()... no
false

$ ruby -v -rmkmf -e 'p havefunc("rbstrsetlen")'
ruby 1.9.4dev (2011-08-05 trunk 32854) [x8664-linux]
checking for rb
strsetlen()... yes
true

Can't you show mkmf.log file?

--
Nobu Nakada

#5 Updated by Eric Wong over 2 years ago

Nobuyoshi Nakada nobu@ruby-lang.org wrote:

Eric Wong wrote in :

I've bisected r32833 to breaking many of my external C extension builds:

$ ruby -rmkmf -e 'p havefunc("rbstrsetlen")'
checking for rbstrset_len()... no
false

$ ruby -v -rmkmf -e 'p havefunc("rbstrsetlen")'
ruby 1.9.4dev (2011-08-05 trunk 32854) [x8664-linux]
checking for rb
strsetlen()... yes
true

Hi, I've noticed passing --enable-shared to ./configure works around
this issue. Only the default static libruby fails.

Can't you show mkmf.log file?

This is my mkmf.log with only --prefix=$HOME/r/trunk passed to
./configure, I see no attempts to link libruby-static at all:

havefunc: checking for rbstrsetlen()... -------------------- no

"gcc -o conftest -I/home/ew/r/trunk/include/ruby-1.9.1/x86_64-linux -I/home/ew/r/trunk/include/ruby-1.9.1/ruby/backward -I/home/ew/r/trunk/include/ruby-1.9.1 -I. -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration conftest.c -L. -L/home/ew/r/trunk/lib -Wl,-R/home/ew/r/trunk/lib -L. -rdynamic -Wl,-export-dynamic -lpthread -lrt -ldl -lcrypt -lm -lc"
checked program was:
/* begin /
1: #include "ruby.h"
2:
3: int main() {return 0;}
/
end */

"gcc -o conftest -I/home/ew/r/trunk/include/ruby-1.9.1/x8664-linux -I/home/ew/r/trunk/include/ruby-1.9.1/ruby/backward -I/home/ew/r/trunk/include/ruby-1.9.1 -I. -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration conftest.c -L. -L/home/ew/r/trunk/lib -Wl,-R/home/ew/r/trunk/lib -L. -rdynamic -Wl,-export-dynamic -lpthread -lrt -ldl -lcrypt -lm -lc"
/tmp/cc0KSG3Y.o: In function t':
/home/ew/ruby/conftest.c:5: undefined reference to
rb
strsetlen'
collect2: ld returned 1 exit status
checked program was:
/* begin /
1: #include "ruby.h"
2:
3: /
top/
4: int main() {return 0;}
5: int t() { void ((
volatile p)()); p = (void (()()))rbstrset_len; return 0; }
/
end */

"gcc -o conftest -I/home/ew/r/trunk/include/ruby-1.9.1/x8664-linux -I/home/ew/r/trunk/include/ruby-1.9.1/ruby/backward -I/home/ew/r/trunk/include/ruby-1.9.1 -I. -O3 -ggdb -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wimplicit-function-declaration conftest.c -L. -L/home/ew/r/trunk/lib -Wl,-R/home/ew/r/trunk/lib -L. -rdynamic -Wl,-export-dynamic -lpthread -lrt -ldl -lcrypt -lm -lc"
conftest.c: In function ‘t’:
conftest.c:5: error: too few arguments to function ‘rb
strsetlen’
checked program was:
/* begin /
1: #include "ruby.h"
2:
3: /
top/
4: int main() {return 0;}
5: int t() { rbstrset_len(); return 0; }
/
end */


--
Eric Wong

#6 Updated by Nobuyoshi Nakada over 2 years ago

  • Status changed from Assigned to Closed

This issue was solved with changeset r32902.
Vit, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • lib/mkmf.rb (init_mkmf): set $LIBRUBYARG regardless of shared option. [Bug #5147]

#7 Updated by Naohisa Goto over 2 years ago

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: RSPARCH44: 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, ktsj reported similar error occurred on Ubuntu 10.4 x8664.

/usr/bin/ld: ../../../libruby-static.a(class.o): relocation RX8664_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.

#8 Updated by Eric Wong over 2 years ago

Naohisa Goto ngotogenome@gmail.com wrote:

In IRC #ruby-ja, ktsj reported similar error occurred on Ubuntu 10.4 x8664.

/usr/bin/ld: ../../../libruby-static.a(class.o): relocation RX8664_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.

Yes, there needs to be a better fix than r32902; it's even more broken
than before.

I get the same error on Debian as Ubuntu without --enable-shared.
--enable-shared continues to work fine.

#9 Updated by Motohiro KOSAKI over 2 years ago

  • Status changed from Closed to Assigned
  • Priority changed from Normal to High

Reopened.

#10 Updated by Nobuyoshi Nakada over 2 years ago

  • Status changed from Assigned to Closed

This issue was solved with changeset r32927.
Vit, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • lib/mkmf.rb (link_command): use LIBRUBYARG in rbconfig for unbundled extensions. [Bug #5147]
  • lib/mkmf.rb (init_mkmf): revert r32902.

#11 Updated by Eric Wong over 2 years ago

Eric Wong normalperson@yhbt.net wrote:

Yes, there needs to be a better fix than r32902; it's even more broken
than before.

r32927 seems good with and without --enable-shared on Debian x86_6:.
Thanks!

Also available in: Atom PDF