From: jean.boussier@... Date: 2021-06-23T13:22:53+00:00 Subject: [ruby-core:104388] [Ruby master Bug#18000] have_library doesn't work when ruby is compiled with --disable-shared --disable-install-static-library Issue #18000 has been updated by byroot (Jean Boussier). Thanks for the workaround, it does work for that very specific gem, however gems checking for specific Ruby APIs are broken by it. e.g. `stackprof` ```ruby require 'mkmf' if have_func('rb_postponed_job_register_one') && have_func('rb_profile_frames') && have_func('rb_tracepoint_new') && have_const('RUBY_INTERNAL_EVENT_NEWOBJ') create_makefile('stackprof/stackprof') else fail 'missing API: are you using ruby 2.1+?' end ``` ``` checking for rb_postponed_job_register_one()... no *** extconf.rb failed *** ``` ``` "gcc -o conftest -I/usr/local/include/ruby-3.1.0/x86_64-linux -I/usr/local/include/ruby-3.1.0/ruby/backward -I/usr/local/include/ruby-3.1.0 -I. -I/usr/local/include -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef conftest.c -L. -L/usr/local/lib -Wl,-rpath,/usr/local/lib -L. -L/usr/local/lib -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-rpath,/usr/local/lib -L/usr/local/lib -lruby-static -lz -lpthread -lrt -lrt -lgmp -ldl -lcrypt -lm -lm -lc" conftest.c: In function ���t���: conftest.c:14:57: error: ���rb_postponed_job_register_one��� undeclared (first use in this function) 14 | int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_postponed_job_register_one; return !p; } | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~ conftest.c:14:57: note: each undeclared identifier is reported only once for each function it appears in conftest.c: At top level: cc1: warning: unrecognized command line option ���-Wno-self-assign��� cc1: warning: unrecognized command line option ���-Wno-parentheses-equality��� cc1: warning: unrecognized command line option ���-Wno-constant-logical-operand��� checked program was: /* begin */ 1: #include "ruby.h" 2: 3: /*top*/ 4: extern int t(void); 5: int main(int argc, char **argv) 6: { 7: if (argc > 1000000) { 8: int (* volatile tp)(void)=(int (*)(void))&t; 9: printf("%d", (*tp)()); 10: } 11: 12: return !!argv[argc]; 13: } 14: int t(void) { void ((*volatile p)()); p = (void ((*)()))rb_postponed_job_register_one; return !p; } /* end */ "gcc -o conftest -I/usr/local/include/ruby-3.1.0/x86_64-linux -I/usr/local/include/ruby-3.1.0/ruby/backward -I/usr/local/include/ruby-3.1.0 -I. -I/usr/local/include -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef conftest.c -L. -L/usr/local/lib -Wl,-rpath,/usr/local/lib -L. -L/usr/local/lib -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-rpath,/usr/local/lib -L/usr/local/lib -lruby-static -lz -lpthread -lrt -lrt -lgmp -ldl -lcrypt -lm -lm -lc" /usr/bin/ld: /tmp/ccLbP8Oe.o: in function `t': /usr/local/lib/ruby/gems/3.1.0/gems/stackprof-0.2.17/ext/stackprof/conftest.c:15: undefined reference to `rb_postponed_job_register_one' collect2: error: ld returned 1 exit status checked program was: /* begin */ 1: #include "ruby.h" 2: 3: /*top*/ 4: extern int t(void); 5: int main(int argc, char **argv) 6: { 7: if (argc > 1000000) { 8: int (* volatile tp)(void)=(int (*)(void))&t; 9: printf("%d", (*tp)()); 10: } 11: 12: return !!argv[argc]; 13: } 14: extern void rb_postponed_job_register_one(); 15: int t(void) { rb_postponed_job_register_one(); return 0; } /* end */ ``` ---------------------------------------- Bug #18000: have_library doesn't work when ruby is compiled with --disable-shared --disable-install-static-library https://bugs.ruby-lang.org/issues/18000#change-92624 * Author: byroot (Jean Boussier) * Status: Open * Priority: Normal * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- Related [Feature #12845] If you compile ruby with `--disable-shared --disable-install-static-library`, then many C-extension won't compile anymore. For instance `RedCloth` ```ruby # extconf.rb require 'mkmf' CONFIG['warnflags'].gsub!(/-Wshorten-64-to-32/, '') if CONFIG['warnflags'] $CFLAGS << ' -O0 -Wall ' if CONFIG['CC'] =~ /gcc/ dir_config("redcloth_scan") have_library("c", "main") create_makefile("redcloth_scan") ``` ``` #mkmf.log "gcc -o conftest -I/usr/local/include/ruby-3.1.0/x86_64-linux -I/usr/local/include/ruby-3.1.0/ruby/backward -I/usr/local/include/ruby-3.1.0 -I. -I/usr/local/include -O3 -fno-fast-math -ggdb3 -Wall -Wextra -Wdeprecated-declarations -Wduplicated-cond -Wimplicit-function-declaration -Wimplicit-int -Wmisleading-indentation -Wpointer-arith -Wwrite-strings -Wimplicit-fallthrough=0 -Wmissing-noreturn -Wno-cast-function-type -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-packed-bitfield-compat -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wsuggest-attribute=format -Wsuggest-attribute=noreturn -Wunused-variable -Wundef -O0 -Wall conftest.c -L. -L/usr/local/lib -Wl,-rpath,/usr/local/lib -L. -L/usr/local/lib -fstack-protector-strong -rdynamic -Wl,-export-dynamic -Wl,-rpath,/usr/local/lib -L/usr/local/lib -lruby-static -lz -lpthread -lrt -lrt -lgmp -ldl -lcrypt -lm -lm -lc" /usr/bin/ld: cannot find -lruby-static collect2: error: ld returned 1 exit status checked program was: /* begin */ 1: #include "ruby.h" 2: 3: int main(int argc, char **argv) 4: { 5: return !!argv[argc]; 6: } /* end */ ``` We'd like to use both flags, the first because it provide a small performance improvement, the second because `libruby-static.a` is enormous (up to 120MiB on debug builds). @alanwu says it's theoretically possible to compile with just the headers. -- https://bugs.ruby-lang.org/ Unsubscribe: