Project

General

Profile

Actions

Bug #5147

closed

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

Added by vo.x (Vit Ondruch) over 13 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
ruby -v:
-
Backport:
[ruby-core:<unknown>]

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

Actions #1

Updated by nobu (Nobuyoshi Nakada) over 13 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]

Updated by normalperson (Eric Wong) over 13 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

Updated by kosaki (Motohiro KOSAKI) over 13 years ago

  • Status changed from Closed to Assigned
  • Assignee set to nobu (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.

Updated by nobu (Nobuyoshi Nakada) over 13 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 [ruby-core:38802]:

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

Updated by normalperson (Eric Wong) over 13 years ago

Nobuyoshi Nakada wrote:

Eric Wong wrote in [ruby-core:38802]:

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

Actions #6

Updated by nobu (Nobuyoshi Nakada) over 13 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.


Updated by ngoto (Naohisa Goto) over 13 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.

Updated by normalperson (Eric Wong) over 13 years ago

Naohisa Goto 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.

Updated by kosaki (Motohiro KOSAKI) over 13 years ago

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

Reopened.

Actions #10

Updated by nobu (Nobuyoshi Nakada) over 13 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.


Updated by normalperson (Eric Wong) over 13 years ago

Eric Wong 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!

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0