2015-03-13 24 views
1

我與g++的情況如下。我構建了一個名爲libplugin.so的共享庫,該庫在運行時由應用程序加載。這libplugin.so鏈接到一些其他共享庫,與-no-as-needed鏈接器選項,並鏈接到一個靜態庫。如何在交叉編譯期間強制鏈接到未安裝的庫

由於libplugin.so本身並不在上市庫使用的任何符號,-no-as-needed才能使所有需要的庫動態加載器加載 - 這是真的只有靜態庫引用 - 當插件在運行時加載-時間。在我的x86建築機器上,所有列爲-no-as-needed的庫都安裝在系統中。所以,圖書館在那裏建得很好,程序也可以。

現在我正在嘗試爲ARM進行交叉編譯,但也存在一些問題,因爲在構建libplugin.so時,鏈接程序無法在系統中找到指示爲-no-as-needed的庫。鏈接無法找到這些庫,因爲它們(故意)未安裝。我寧願不安裝它們。

所以這是我的問題。由於libplugin.so沒有直接引用以任何方式傳遞給-no-as-needed的庫,有沒有辦法強制鏈接器生成libplugin.so,儘管傳遞給-no-as-needed的ARM庫不存在於我的x86構建系統中?

下面是一個例子:

arm-linux-gnueabihf-g++ -o libplugin.so module1.o module2.o -L./libstatic.a -Wl,--no-as-needed -lX11 -lXext -shared -s -fPIC 
arm-linux-gnueabihf-ld: cannot find -lX11 

回答

1

AFAIK你不能輕易做到這一點。但由於你的圖書館沒有你要鏈接到共享庫使用任何東西,你應該能夠創建一個虛擬的libx11庫,並鏈接到欺騙鏈接:

arm-linux-gnueabihf-gcc -x c -shared -o libX11.so -Wl,-soname,libX11.so.6 /dev/null 

這將創建一個相當您可以鏈接到空的libX11.so。重要的部分是這個圖書館的soname,它必須與真正的圖書館的soname相匹配 - 你可以用例如

readelf -a /lib/libX11.so |grep soname 
相關問題