[英]gcc shared library failed linking to glibc
我正在Linux 64bit下使用Eclipse CDT編寫一個簡單的C共享庫。
代碼對<stdlib.h>
的rand()
函數有一個引用。它編譯得很好但是在鏈接時報告來自鏈接器的以下錯誤:
gcc -shared -o "libalg.so" ./sort.o
/usr/bin/ld: ./sort.o: relocation R_X86_64_PC32 against undefined symbol `rand@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Bad value
sort.o是從文件編譯的目標文件。 libalg.so是目標共享庫名稱。
誰能解釋為什么會這樣?
謝謝。
在x86_64
架構上, gcc
要求您默認使用-fPIC
即Position Independent Code。
該錯誤的根本原因是符號rand
的重定位類型是R_X86_64_PC32
類型,這意味着它是PC相對的,並且應該位於與下一條指令相差32bit
范圍內。
但目前的架構是x86_64
類型,這意味着它可以位於64bit
地址空間內的任何位置。
因此,動態鏈接器實際上無法將符號與此類重定位類型鏈接。
您必須使用-fPIC
或使用-mcmodel=large
編譯代碼,這實際上會使重定位類型為R_X86_64_64
。
有關鏈接如何完成的更多詳細信息,請參閱Eli Bendersky撰寫的這篇精彩博客
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.