2012-01-11 38 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位安裝? – 2012-01-11 06:43:12

+0

兩者都是32位('uname -m'的輸出是i686) – sholsapp 2012-01-11 06:45:50

+0

#def是否與測試和生產相關。鏈接器不會包含未使用的庫的鏈接。 – 2012-01-11 06:46:58

回答

7

TL;博士版本:添加-Wl,--no-as-needed到鏈接命令。

經過一系列與OP的實驗和對話之後,我已經知道發生了什麼。

在最新版本的Ubuntu中,ld默認使用--as-needed。所做的是去除對明確不需要的庫的引用。

Hoard的工作方式是作爲LD_PRELOAD庫。即您不需要直接使用libhoard.so中的函數。當然,如果你想... 可以鏈接libhoard,當然,除非使用--as-needed

發現後,解決方案很簡單。只需將-Wl,--no-as-needed添加到gcc鏈接命令。

+1

令人驚歎!謝謝! =) – sholsapp 2012-01-11 07:46:21