2012-01-11 4 views
2

У меня есть общая библиотека (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) 
+0

Является ли рабочая машина 64-разрядной установкой, а сломанная - 32-разрядной установкой? –

+0

Оба являются 32-разрядными (вывод 'uname -m' is i686) – sholsapp

+0

Есть ли # def, связанные с тестированием и производством. Линкер не будет включать ссылку на библиотеку, которая не используется. –

ответ

7

ТЛ; др версия: Добавить -Wl,--no-as-needed в команду ссылки.

После серии экспериментов и разговоров с ОП я выяснил, что происходит.

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

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

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

+1

Удивительно! Спасибо! знак равно – sholsapp