Общая библиотека загадочным образом не связана с приложением - PullRequest
2 голосов
/ 11 января 2012

У меня есть общая библиотека (libhoard.so), которую я пытаюсь связать с помощью простого тестового двоичного файла.Однако, в зависимости от машины, которую я компилирую на разделяемой библиотеке, в тестовом двоичном файле не отображается.Я не уверен, какие различия существуют на машинах, и отчасти поэтому я задаю вопрос. Мне любопытно, что я могу сделать, чтобы выяснить, почему общая библиотека не отображается в тестовом двоичном файле на «сломанной» машине?


Я использовал эту команду дляскомпилировать оба двоичных файла (libhoard.so находится в одном каталоге):

$ g++ -L. -lhoard hoard_test.o 

Сломанный компьютер:

$ ldd a.out 
  linux-gate.so.1 =>  (0x00858000)
  libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x004dc000)
  libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00aaf000)
  libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x00675000)
  /lib/ld-linux.so.2 (0x00d18000)
  libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x0040d000)

Рабочий компьютер:

$ ldd a.out 
  linux-gate.so.1 =>  (0x00110000)
  libhoard.so (0x00111000) <----------------- THERE IT IS!
  libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x03ba8000)
  libm.so.6 => /lib/libm.so.6 (0x007a9000)
  libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00bf7000)
  libc.so.6 => /lib/libc.so.6 (0x0063e000)
  libdl.so.2 => /lib/libdl.so.2 (0x007d4000)
  libpthread.so.0 => /lib/libpthread.so.0 (0x007db000)
  /lib/ld-linux.so.2 (0x0061e000)

Вот некоторая случайная информация о версии:

Сломанная машина:

$ uname -srv
Linux 2.6.38-11-generic #50-Ubuntu SMP Mon Sep 12 21:18:14 UTC 2011
$ g++ --version
g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1

Рабочая машина:

$ uname -srv
Linux 2.6.25.3-18.fc9.i686 #1 SMP Tue May 13 05:38:53 EDT 2008
$ g++ --version
g++ (GCC) 4.3.0 20080428 (Red Hat 4.3.0-8)

1 Ответ

7 голосов
/ 11 января 2012

tl; dr version: добавьте -Wl,--no-as-needed к команде ссылки.

После серии экспериментов и бесед с OP я выяснил, что происходит.

В последней версии Ubuntu ld по умолчанию использует --as-needed.Для этого нужно удалить ссылки на библиотеки, которые явно не требуются.

Работа Hoard работает как библиотека LD_PRELOAD.то есть вам не нужно использовать функции в libhoard.so напрямую.Конечно, вы могли бы напрямую ссылаться на libhoard, если хотите ... если, конечно, не используется --as-needed.

После обнаружения этого решение простое.Просто добавьте -Wl,--no-as-needed к команде связывания gcc.

...