Bug #5147

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

Added by Vit Ondruch about 4 years ago. Updated about 4 years ago.

[ruby-core:<unknown>]
Status:Closed
Priority:Normal
Assignee:Nobuyoshi Nakada
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(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
'

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

Associated revisions

Revision 32833
Added by Nobuyoshi Nakada about 4 years ago

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

Revision 32833
Added by Nobuyoshi Nakada about 4 years ago

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

Revision 32902
Added by Nobuyoshi Nakada about 4 years ago

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

Revision 32902
Added by Nobuyoshi Nakada about 4 years ago

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

Revision 32927
Added by Nobuyoshi Nakada about 4 years ago

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

Revision 32927
Added by Nobuyoshi Nakada about 4 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 about 4 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 about 4 years ago

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

$ ruby -rmkmf -e 'p have_func("rb_str_set_len")'
checking for rb_str_set_len()... no
false

#3 Updated by Motohiro KOSAKI about 4 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 have_func("rb_str_set_len")'
checking for rb_str_set_len()... no
false

Nobu? please answer this.

#4 Updated by Nobuyoshi Nakada about 4 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 have_func("rb_str_set_len")'
checking for rb_str_set_len()... no
false

$ ruby -v -rmkmf -e 'p have_func("rb_str_set_len")'
ruby 1.9.4dev (2011-08-05 trunk 32854) [x86_64-linux]
checking for rb_str_set_len()... yes
true

Can't you show mkmf.log file?

--
Nobu Nakada

#5 Updated by Eric Wong about 4 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 have_func("rb_str_set_len")'
checking for rb_str_set_len()... no
false

$ ruby -v -rmkmf -e 'p have_func("rb_str_set_len")'
ruby 1.9.4dev (2011-08-05 trunk 32854) [x86_64-linux]
checking for rb_str_set_len()... 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:

have_func: checking for rb_str_set_len()... -------------------- 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/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"
/tmp/cc0KSG3Y.o: In function t':
/home/ew/ruby/conftest.c:5: undefined reference to
rb_str_set_len'
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 (()()))rb_str_set_len; return 0; }
/* end */

"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"
conftest.c: In function ‘t’:
conftest.c:5: error: too few arguments to function ‘rb_str_set_len’
checked program was:
/* begin /
1: #include "ruby.h"
2:
3: /*top
/
4: int main() {return 0;}
5: int t() { rb_str_set_len(); return 0; }
/* end */


--
Eric Wong

#6 Updated by Nobuyoshi Nakada about 4 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 about 4 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: 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.

#8 Updated by Eric Wong about 4 years ago

Naohisa Goto ngotogenome@gmail.com wrote:

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.

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 about 4 years ago

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

Reopened.

#10 Updated by Nobuyoshi Nakada about 4 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 about 4 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