From: "Eregon (Benoit Daloze)" <noreply@...> Date: 2022-01-21T14:53:56+00:00 Subject: [ruby-core:107230] [Ruby master Bug#18249] The ABI version of dev builds of CRuby does not correspond to the ABI Issue #18249 has been updated by Eregon (Benoit Daloze). Also from experience in TruffleRuby I can say this is a solution working very well to avoid users unintentionally reusing gems with an incompatible ABI, which usually ends up in segfaults or other errors. CRuby did not care enough about this, and lots of people wasted time due to this issue (I saw multiple reports on this subject), so let's solve it. Ruby switchers/RubyGems/Bundler need to do their part, but they can't if the ABI version CRuby reports is wrong. > There's assumptions that the format of ruby_version is three, period separated integers. I tried adding a tag with the ABI version (e.g. 3.2.0+12345) and Bundler fails with a Malformed version number string. There might be more places that have this kind of assumption, so I feel like changing ruby_version will be a breaking change. How about `3.2.0.12345` then? It is a bug of any software to assume exactly 3 digits for ABI version, for instance on TruffleRuby it's 4+ digits (e.g. `3.0.2.9` on current truffleruby-dev version). ---------------------------------------- Bug #18249: The ABI version of dev builds of CRuby does not correspond to the ABI https://bugs.ruby-lang.org/issues/18249#change-96090 * Author: Eregon (Benoit Daloze) * Status: Open * Priority: Normal * Backport: 2.6: UNKNOWN, 2.7: UNKNOWN, 3.0: UNKNOWN ---------------------------------------- In fact, it even conflicts with the next release's ABI version: ``` $ ruby -ve 'p RbConfig::CONFIG["ruby_version"]' ruby 3.1.0dev (2021-10-11T10:13:16Z master 0c3ac87345) [x86_64-linux] "3.1.0" ``` This mismatch can very easily result in segfaults, memory corruption, etc when using dev versions of CRuby, or when using a dev version and then later the release. Possible solutions: * Include the git commit sha in the ABI. Pros: always correct and simple. Cons: changing more then necessary. * Track the ABI explicitly, and bump it whenever the ABI changes. Pros: changes only when needed. Cons: easy to forget bumping it, and if checked in CI already too late. From https://bugs.ruby-lang.org/issues/18239#note-14: FWIW TruffleRuby actually tracks the ABI of dev versions through [this file](https://github.com/oracle/truffleruby/blob/master/lib/cext/ABI_version.txt) which means it is possible to sensibly cache compiled gems even for dev versions [details](https://github.com/oracle/truffleruby/issues/2284). Also it [stores](https://github.com/oracle/truffleruby/commit/d497bae73fdc60585b66cd183768a16563b2886b) the ABI version in .so/.bundle files and checks them when loading, so it can be sure the ABI used to compile and runtime ABI match (if not, an exception is raised). ruby/setup-ruby has no choice for CRuby dev but [to use the commit](https://github.com/ruby/setup-ruby/blob/a6f22865941e122a37e097fbded3dd0b54c39207/bundler.js#L188) as the ABI version. This issue is made worse by Ruby switchers like RVM & chruby setting GEM_HOME (so the ABI is effectively ignored by RubyGems in those cases, and those directories need to be cleaned manually). When GEM_HOME is not set, it would be enough to rebuild CRuby dev and remove the directory before installing (which includes both CRuby & gems), but Ruby installers don't do that yet. Bundler always includes the ABI version when setting the bundler path (`bundle config --local path`), but if the ABI version is incorrect like for CRuby dev it's of no use. -- https://bugs.ruby-lang.org/ Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>