背景
之前寫過JNI的文章,在JNI實(shí)踐過程中,也涉及到對動(dòng)態(tài)庫/靜態(tài)庫的一些編譯實(shí)踐,這里統(tǒng)一記錄一下。文章來源:http://www.zghlxwxcb.cn/news/detail-796620.html
動(dòng)態(tài)庫(.so文件)
- 注意:-fPIC編譯選項(xiàng)可使GCC生成位置無關(guān)代碼,簡單來說生成的代碼中的函數(shù)與全局變量均為相對地址,通過GOT (Global offset table)來確定其位置,這種方式引入了一層額外的間接性,會(huì)有一定的性能損失。
gcc -c -W -Wall -Werror -fpic foo.c
gcc -shared -o libfoo.so foo.o
gcc -L/home/username/foo -W -Wall -o test main.c -lfoo
- 在linux配置動(dòng)態(tài)庫使用位置,有如下兩種方式:
- 使用環(huán)境變量來可配置的使用動(dòng)態(tài)庫
export LD_LIBRARY_PATH=/home/username/foo:$LD_LIBRARY_PATH
#只有導(dǎo)出這個(gè)環(huán)境變量才能被子進(jìn)程繼承
./test
- 使用rpath指定動(dòng)態(tài)庫的絕對路徑
unset LD_LIBRARY_PATH
gcc -L/home/username/foo -Wl,-rpath=/home/username/foo -Wall -o test main.c -lfoo
./test
- 將動(dòng)態(tài)庫就安裝到系統(tǒng)中,這樣編譯時(shí)就可以不加-L
cp /home/username/foo/libfoo.so /usr/lib
#/usr/lib是32位 /usr/lib64是64位
chmod 0755 /usr/lib/libfoo.so
ldconfig
- 查看動(dòng)態(tài)庫
nm -D libmyfunc.so
靜態(tài)庫(.a文件)
- 靜態(tài)庫實(shí)際上是一組目標(biāo)文件(object files)的打包,可以通過工具(例如ar)將它們組合成一個(gè)歸檔文件(archive file)。
gcc -c myfunc.c -o myfunc.o
ar rcs libmyfunc.a myfunc.o
#查看這個(gè)靜態(tài)庫里面都打包了什么obj文件
ar tf myfunc.a
#查看靜態(tài)庫中都有哪些符號
nm myfunc.a
關(guān)于GLIBC
我們知道Linux Kernel是使用GNC C編譯器編譯的,那么GLIBC是我們肯定要用到的庫,Kernel和GLIBC兩者的版本關(guān)系在link時(shí)確定,所以我們要保證不要自行升級GLIBC,否則會(huì)導(dǎo)致kernel無法啟動(dòng)。文章來源地址http://www.zghlxwxcb.cn/news/detail-796620.html
- 查看動(dòng)態(tài)庫關(guān)聯(lián)的GLIBC版本:
ldd -v myexample.so
- 查看動(dòng)態(tài)庫中的所有符號
nm -D myexample.so
到了這里,關(guān)于Linux下動(dòng)態(tài)庫和靜態(tài)庫編譯實(shí)踐的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!