LINUX.ORG.RU

Странное поведение binutils-2.25 при линковке .so не по системным путям

 ,


0

1

Сижу, никого не трогаю, ковыряю сайтег на рубирельсах, в процессе ВНЕЗАПНО оказалось, что я юзаю не системный 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? Или это они так решили тихо и незаметно изменить поведение линкера?

★★★★★

Первый выхлоп выглядит красивее, чем 2й. Во 2м вообще куета какая-то, скорее должен быть rpath и soname.

А проблема основная в помойке.

vasily_pupkin ★★★★★ ()

Когда уже рельсоеды перестанут ехал bundle через bundle. Нормальные проекты нормально живут в репозитарии, а эти — каждые пять минут новый мажорный релиз!

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.