我想交叉編譯使用共享庫,位於:/system/lib/libxyz.so(在主機設備上),並使用動態鏈接器:/ system/bin/linker - 它也位於主機設備上。鏈接共享庫,但實際上沒有它
所以我編譯:
arm-eabi-gcc -mcpu="cortex-a9" -Wl,-dynamic-linker=/system/bin/linker -llibxyz.so -Wl,--unresolved-symbols=ignore-all -nostdlib topsecret.S -o topsecret
我還使用:
-Wl,--unresolved-symbols=ignore-all
忽略任何未定義的符號,我真的不有他們在編譯時 - 我走的彙編代碼調用的正確地址。
,我發現了微不足道的錯誤是:
arm-eabi/bin/ld cannot find -llibxyz.so, collect2: ld returned 1 exit status
而且我不actally希望有libxyz.so庫,我希望編譯器忽略錯誤,並添加依賴性ELF頭。 我嘗試了--Wl, - 沒有需要的, - WL, - 根據需要的論點,但沒有幫助。
問題是,如果我可以忽略錯誤,假庫或任何其他解決方案,這將給我在頭中具有依賴性的良好二進制文件。
Link shared library in gcc without file? 該解決方案不好,因爲我不想更改asm代碼,只有編譯機制。
對不起,但你想要做的是不可能的。鏈接器想要看到共享庫,以便知道哪些符號在那裏定義,哪些不符合;它需要知道,瞭解如何聯繫將起作用。您必須將目標的共享庫複製到開發系統,否則使用您參考的答案(dlopen等)中建議的顯式加載並使用dlsym()自己創建鏈接。 – MadScientist
您可以將文件從* host *轉移到* build *。如果你不能這樣做,那麼鏈接器就無法知道哪個庫存在未解析的符號。你可以創建一個假的*主機*庫,並帶有墊片以供實現。即使你不能傳輸*主機*庫(主機鎖定或者其他),這也可以工作。這將允許您鏈接到構建機器上,並且它應該通過其加載程序修補到*主機*上的完整實現。 –
MadScientist:謝謝你的回答。你說的話可能會起作用。如果沒有其他'hacky'解決方案,我將使用dlload/dlsym api。無聲的噪音:謝謝你的回答,這也是很好的選擇,可以節省很多時間。唯一的缺點是我需要創建/維護那些虛假的庫,只要我想做'特殊鏈接'操作。我會考慮這一點,除非沒有其他方式強制鏈接。謝謝。 – skoperst