GCC生成動態鏈接庫(.so文件):-shared和-fPIC選項


Linux 下動態鏈接庫(shared object file,共享對象文件)的文件后綴為.so,它是一種特殊的目標文件(object file),可以在程序運行時被加載(鏈接)進來。使用動態鏈接庫的優點是:程序的可執行文件更小,便於程序的模塊化以及更新,同時,有效內存的使用效率更高。

GCC 生成動態鏈接庫

如果想創建一個動態鏈接庫,可以使用 GCC 的-shared選項。輸入文件可以是源文件、匯編文件或者目標文件。

另外還得結合-fPIC選項。-fPIC 選項作用於編譯階段,告訴編譯器產生與位置無關代碼(Position-Independent Code);這樣一來,產生的代碼中就沒有絕對地址了,全部使用相對地址,所以代碼可以被加載器加載到內存的任意位置,都可以正確的執行。這正是共享庫所要求的,共享庫被加載時,在內存的位置不是固定的。

例如,從源文件生成動態鏈接庫:

$ gcc -fPIC -shared func.c -o libfunc.so

 從目標文件生成動態鏈接庫:

$ gcc -fPIC -c func.c -o func.o
$ gcc -shared func.o -o libfunc.so

 -fPIC 選項作用於編譯階段,在生成目標文件時就得使用該選項,以生成位置無關的代碼。

GCC 將動態鏈接庫鏈接到可執行文件

如果希望將一個動態鏈接庫鏈接到可執行文件,那么需要在命令行中列出動態鏈接庫的名稱,具體方式和普通的源文件、目標文件一樣。請看下面的例子:

$ gcc main.c libfunc.so -o app.out

 將 main.c 和 libfunc.so 一起編譯成 app.out,當 app.out 運行時,會動態地加載鏈接庫 libfunc.so。

當然,必須要確保程序在運行時可以找到這個動態鏈接庫。你可以將鏈接庫放到標准目錄下,例如 /usr/lib,或者設置一個合適的環境變量,例如 LIBRARY_PATH。不同系統,具有不同的加載鏈接庫的方法。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM