
[英]Conflicting Achitecture profiles A/M Error using arm-none-linux-gnueabi-gcc
[英]How can I link libc.a into a shared library in arm-linux use arm-none-linux-gnueabi-gcc
在一個項目中,我的同事創建了一個靜態庫,例如liba.a,它與app鏈接。
在liba.a中,他將libc malloc()覆蓋為其所有者版本。
我創建了一個共享庫libs.so,它也與app鏈接。
問題是當我的libs.so與app鏈接時,我的libs.so中使用的malloc()將是liba.a中的那個,而不是標准libc.so中的那個,這會導致問題。
然后,我想將libc.a靜態鏈接到我的libs.so,我為gcc使用了-static -shared -fPIC標志。
但我總是得到arm-2012.03 / bin /../ lib / gcc / arm-none-linux-gnueabi / 4.6.3 /../../../../ arm-none-linux-gnueabi / bin / ld:arm-2012.03 / bin /../ arm-none-linux-gnueabi / libc / usr / lib / libc.a(dl-tsd.o)(。text + 0x14):共享對象中不允許R_ARM_TLS_LE32重定位。
有沒有人有這個想法?
謝謝你。
您不能,因為共享庫中的代碼必須使用-fPIC
進行編譯,而靜態庫中的代碼則不能。 如果你設法做到這一點,生成的可執行文件最終會多次與libc鏈接,無論如何都會非常脆弱,可能遲早會崩潰,所以你不應該這樣做。 因此:
不要 。 動態庫必須動態鏈接到系統庫,任何鏈接到任何動態庫的可執行文件也必須動態鏈接系統庫。
我還想提醒您,將GNU libc與非GPL應用程序靜態鏈接是非法的,因為LGPL僅排除動態鏈接代碼。 這是為了允許錯誤修復庫而無需重新編譯可能無法獲得源的可執行文件。 在Linux中使用bugfixed版本升級共享庫而不重新編譯依賴的可執行文件是相當常見的; libc開發人員知道如何做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.