Bug #5147
closedmkmf should not require static library when ruby is built with --enable-shared
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
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 nobu@ruby-lang.org 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
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.
- lib/mkmf.rb (init_mkmf): set $LIBRUBYARG regardless of shared
option. [ruby-core:38802] [Bug #5147]
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 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 valuePlease 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.
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.
- lib/mkmf.rb (link_command): use LIBRUBYARG in rbconfig for
unbundled extensions. [ruby-core:38802] [Bug #5147] - lib/mkmf.rb (init_mkmf): revert r32902. [ruby-core:38903]
Updated by normalperson (Eric Wong) over 13 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!