Сижу, никого не трогаю, ковыряю сайтег на рубирельсах, в процессе ВНЕЗАПНО оказалось, что я юзаю не системный bundler, а какую-то старую версию, поставленную через rvm, когда в генте ещё ruby 2.0 был замаскирован. Так как теперь со новыми рубями всё ок, решаю снести нахрен rvm и юзать системный ruby. В процессе сноса оказывается, что у меня бинарные либы в бандле были слинкованы с rvm'овским libruby и теперь их надо пересобирать. Ну фигли, сношу vendor/bundle, bundle install, ждём-с... вроде установилось.
Но хрен там:
rake aborted!
LoadError: nokogiri.so: cannot open shared object file: No such file or directory - /home/infoman/work/dev/rails4/projectname/vendor/bundle/ruby/2.0.0/extensions/x86-linux/2.0.0/nokogumbo-1.2.0/nokogumboc.so
При этом в продакшене всё работает и корректно находит все нужные либы, специально там тоже пересобрал.
После долгого колупания доколупался до непосредственно вызова линкера в виде
/usr/libexec/gcc/i686-pc-linux-gnu/4.8.4/collect2 --verbose=2 --eh-frame-hdr -m elf_i386 -shared -o nokogumboc.so /usr/lib/gcc/i686-pc-linux-gnu/4.8.4/../../../../lib/crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.8.4/crtbeginS.o -L. -L/usr/lib -L. -L/home/infoman/work/dev/rails4/bundler-test/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.6.2/ext/nokogiri -L/usr/lib/gcc/i686-pc-linux-gnu/4.8.4 -L/usr/lib/gcc/i686-pc-linux-gnu/4.8.4/../../../../i686-pc-linux-gnu/lib/../lib -L/usr/lib/gcc/i686-pc-linux-gnu/4.8.4/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/i686-pc-linux-gnu/4.8.4/../../../../i686-pc-linux-gnu/lib -L/usr/lib/gcc/i686-pc-linux-gnu/4.8.4/../../.. string_buffer.o tag.o attribute.o char_ref.o nokogumbo.o vector.o parser.o error.o tokenizer.o utf8.o string_piece.o util.o -O1 --as-needed -export-dynamic --no-undefined -l:nokogiri.so -lruby20 -lxml2 -lxml2 -lpthread -lrt -ldl -lcrypt -lm -lc -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-pc-linux-gnu/4.8.4/crtendS.o /usr/lib/gcc/i686-pc-linux-gnu/4.8.4/../../../../lib/crtn.o
И выдал мне линкер выхлоп, в котором из относящегося к делу про nokogiri.so было примерно следующее:
attempt to open ./nokogiri.so failed
attempt to open ./nokogiri.so failed
attempt to open /usr/lib/nokogiri.so failed
attempt to open /usr/lib/nokogiri.so failed
attempt to open ./nokogiri.so failed
attempt to open ./nokogiri.so failed
attempt to open /home/infoman/work/dev/rails4/bundler-test/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.6.2/ext/nokogiri/nokogiri.so succeeded
-l:nokogiri.so (/home/infoman/work/dev/rails4/bundler-test/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.6.2/ext/nokogiri/nokogiri.so)
И в результирующем nokogumboc.so рисовался такой линк:
Dynamic section at offset 0x5aed8 contains 26 entries:
Tag Type Name/Value
0x00000001 (NEEDED) Shared library: [nokogiri.so]
И была это версия ld из binutils-2.25.
Тогда как на машине, где всё работало, стояли binutils-2.24, и генерили выхлоп:
attempt to open nokogiri.so failed
attempt to open ./nokogiri.so failed
attempt to open /usr/lib64/nokogiri.so failed
attempt to open ./nokogiri.so failed
attempt to open /var/www/see-2014/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.6.2/ext/nokogiri/nokogiri.so succeeded
nokogiri.so (/var/www/see-2014/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.6.2/ext/nokogiri/nokogiri.so)
(Что значит -l: в первом выхлопе и его отсутствие во втором?)
И результат:
Dynamic section at offset 0x57d90 contains 26 entries:
Tag Type Name/Value
0x0000000000000001 (NEEDED) Shared library: [/var/www/see-2014/vendor/bundle/ruby/2.0.0/gems/nokogiri-1.6.6.2/ext/nokogiri/nokogiri.so]
Тут либа линкуется по её полному пути и прекрасно грузится, пока весь бандл не переедет в другое место.
В итоге сдаунгрейдил binutils до 2.24 и всё заработало.
Баг в binutils? Или это они так решили тихо и незаметно изменить поведение линкера?