* Compilation on Solaris/SmartOS @ 2013-08-27 11:02 Jonathan del Strother 2013-08-27 19:40 ` Eric Wong 0 siblings, 1 reply; 5+ messages in thread From: Jonathan del Strother @ 2013-08-27 11:02 UTC (permalink / raw) To: raindrops Hi, I was having trouble using Raindrops on our i386 SmartOS servers. The gem would compile fine, but bomb out at runtime : ruby -rraindrops -e "Raindrops.new(1).incr(0)" ld.so.1: ruby: fatal: relocation error: file /..../gems/raindrops-0.10.0/lib/raindrops_ext.so: symbol __sync_add_and_fetch_4: referenced symbol not found I was able to fix this with march=native - I added something like this to extconf.rb - if CONFIG["arch"]=~/solaris/ $CPPFLAGS += " -march=native" end I'm not familiar enough with building the atomic libs to say whether it's definitely the correct fix, but it seems to work, and the ruby-atomic gem needed something similar : https://github.com/headius/ruby-atomic/blob/master/ext/extconf.rb. Any thoughts? ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Compilation on Solaris/SmartOS 2013-08-27 11:02 Compilation on Solaris/SmartOS Jonathan del Strother @ 2013-08-27 19:40 ` Eric Wong 2013-08-28 9:16 ` Jonathan del Strother 0 siblings, 1 reply; 5+ messages in thread From: Eric Wong @ 2013-08-27 19:40 UTC (permalink / raw) To: raindrops Jonathan del Strother <maillist@steelskies.com> wrote: > Hi, > I was having trouble using Raindrops on our i386 SmartOS servers. The gem > would compile fine, but bomb out at runtime : > > ruby -rraindrops -e "Raindrops.new(1).incr(0)" > ld.so.1: ruby: fatal: relocation error: file > /..../gems/raindrops-0.10.0/lib/raindrops_ext.so: symbol > __sync_add_and_fetch_4: referenced symbol not found > > I was able to fix this with march=native - I added something like this to > extconf.rb - > > if CONFIG["arch"]=~/solaris/ > $CPPFLAGS += " -march=native" > end $CPPFLAGS is an odd choice, $CFLAGS is more correct from a pedantic standpoint even though normal builds do both preprocessing and compilation in the same invokation. So perhaps the following (can you test?): if CONFIG["arch"]=~/solaris/ $CFLAGS += " -march=native" end > I'm not familiar enough with building the atomic libs to say whether it's > definitely the correct fix, but it seems to work, and the ruby-atomic gem > needed something similar : > https://github.com/headius/ruby-atomic/blob/master/ext/extconf.rb. Any > thoughts? How does Ruby 2.0.0 / trunk build? That also uses __sync_* and I can't find -march=native anywhere. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Compilation on Solaris/SmartOS 2013-08-27 19:40 ` Eric Wong @ 2013-08-28 9:16 ` Jonathan del Strother 2013-08-28 10:13 ` Eric Wong 0 siblings, 1 reply; 5+ messages in thread From: Jonathan del Strother @ 2013-08-28 9:16 UTC (permalink / raw) To: raindrops > > I'm not familiar enough with building the atomic libs to say whether > it's > > definitely the correct fix, but it seems to work, and the ruby-atomic gem > > needed something similar : > > https://github.com/headius/ruby-atomic/blob/master/ext/extconf.rb. Any > > thoughts? > > How does Ruby 2.0.0 / trunk build? That also uses __sync_* and I can't > find -march=native anywhere. > Ruby 2 appears to build & run fine... I'm not sure what I'd need to execute to ensure I run a __sync_* instruction, but messed around with threads & mutexes without problems. Interestingly, when I build raindrops with my regular ruby 1.9.3 install, the generated makefile includes "ARCH_FLAG = -m32", but when I build raindrops with ruby 2 / trunk, I get "ARCH_FLAGS = -march=i486". When built with that flag, Raindrops works fine. ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Compilation on Solaris/SmartOS 2013-08-28 9:16 ` Jonathan del Strother @ 2013-08-28 10:13 ` Eric Wong 2013-08-29 9:58 ` Jonathan del Strother 0 siblings, 1 reply; 5+ messages in thread From: Eric Wong @ 2013-08-28 10:13 UTC (permalink / raw) To: raindrops Jonathan del Strother <maillist@steelskies.com> wrote: > > > I'm not familiar enough with building the atomic libs to say whether > > it's > > > definitely the correct fix, but it seems to work, and the ruby-atomic gem > > > needed something similar : > > > https://github.com/headius/ruby-atomic/blob/master/ext/extconf.rb. Any > > > thoughts? > > > > How does Ruby 2.0.0 / trunk build? That also uses __sync_* and I can't > > find -march=native anywhere. Ah, it just used -march=i486 which is enough. I missed your i386 mention in your first email, my mind just immediately associated Solaris/SmartOS with SPARC :x > Ruby 2 appears to build & run fine... I'm not sure what I'd need to execute > to ensure I run a __sync_* instruction, but messed around with threads & > mutexes without problems. It's used pretty heavily (GC, signals, thread switches). I haven't had __sync_* fail me once it built. > Interestingly, when I build raindrops with my regular ruby 1.9.3 install, > the generated makefile includes "ARCH_FLAG = -m32", but when I build > raindrops with ruby 2 / trunk, I get "ARCH_FLAGS = -march=i486". When > built with that flag, Raindrops works fine. Ah, 2.0.0 adds -march=i486 in this way. How about the following patch? I just pushed it up to git://bogomips.org/raindrops.git diff --git a/ext/raindrops/extconf.rb b/ext/raindrops/extconf.rb index 447a90a..f012808 100644 --- a/ext/raindrops/extconf.rb +++ b/ext/raindrops/extconf.rb @@ -20,6 +20,7 @@ int main(int argc, char * const argv[]) { unsigned long i = 0; __sync_lock_test_and_set(&i, 0); __sync_lock_test_and_set(&i, 1); + __sync_bool_compare_and_swap(&i, 0, 1); __sync_add_and_fetch(&i, argc); __sync_sub_and_fetch(&i, argc); return 0; @@ -30,7 +31,17 @@ SRC $defs.push(format("-DHAVE_GCC_ATOMIC_BUILTINS")) true else - false + # some compilers still target 386 by default, but we need at least 486 + # to run atomic builtins. + prev_cflags = $CFLAGS + $CFLAGS += " -march=i486 " + if try_link(src) + $defs.push(format("-DHAVE_GCC_ATOMIC_BUILTINS")) + true + else + prev_cflags = $CFLAGS + false + end end end or have_header('atomic_ops.h') or abort <<-SRC On a side note, I'm kind of curious about the reasoning for staying with 32-bit, though. There's a lot more registers on x86_64 Ruby 1.9+ packs more short strings (up to 23 bytes vs 11 bytes on 32-bit), so you won't incur malloc/free for short strings. With Ruby 2.0.0, you also get Flonum (avoids malloc for some Floats, like Fixnum vs Bignum). ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: Compilation on Solaris/SmartOS 2013-08-28 10:13 ` Eric Wong @ 2013-08-29 9:58 ` Jonathan del Strother 0 siblings, 0 replies; 5+ messages in thread From: Jonathan del Strother @ 2013-08-29 9:58 UTC (permalink / raw) To: raindrops > > Ah, 2.0.0 adds -march=i486 in this way. How about the following patch? > I just pushed it up to git://bogomips.org/raindrops.git Works great, thanks. > On a side note, I'm kind of curious about the reasoning for staying with > 32-bit, though. There's a lot more registers on x86_64 > It builds 32 bit by default, which I assumed was for a good reason. We're due to upgrade to Ruby 2 soon, I'll make sure we try out the 64 bit build. ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-08-29 9:59 UTC | newest] Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2013-08-27 11:02 Compilation on Solaris/SmartOS Jonathan del Strother 2013-08-27 19:40 ` Eric Wong 2013-08-28 9:16 ` Jonathan del Strother 2013-08-28 10:13 ` Eric Wong 2013-08-29 9:58 ` Jonathan del Strother
Code repositories for project(s) associated with this public inbox https://yhbt.net/raindrops.git/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).