你知道windows下的dll文件嗎???
其實和linux下的so文件是一回事,,so文件也版是編譯好了的二進制的權鏈接庫文件,,,
一般來說都是c或c++編譯出來的,,java的話通常是用的位元組碼,也就是class文件。。
你自己寫一個 helloworld的c程序,然後在命令行下用編譯器編譯gcc -c helloworld.c -o hello.o這樣編譯出來的結果就是那樣的東西了。。這樣的文件是不能直接運行的。。
B. 什麼是SO文件
so文件是Linux下的程序函數庫,即編譯好的可以供其他程序使用的代碼和數據。專
C. linux so是什麼 文件
.so文件代表Linux的共享函數庫文件,程序運行時可能會使用到裡面的函數代碼。當一個程序需要.so共享函數庫文件時,系統自動會把它載入到內存中使用。相當於Windows系統裡面的dll動態鏈接庫文件。
D. so格式文件是什麼文件
這個是linux系統下的文件,你的手機應該是安卓平台,安卓平台是從linux內核的基礎上發展過來的,所以會有後綴為.so(sharedobject)的文件,當然這樣解釋不夠精確、詳細,肯定會被吐槽,具體如下:
准確地、詳細地來說,
手機裡面有硬體,也就是弱電學中的電路,電路組成了CPU和協助CPU的外圍電路,
CPU上面移植了Linux內核,好,接下來就開始百花齊放了:
1、有的手機跑的是安卓的系統
2、有的時候跑的是linux系統
他們都基於Linux內核,對於Linux內核有不同的擴充,有的擴充成A系統,叫安卓,有的擴充成B系統,叫Linux,但是手機上,安卓相對linux,更加流行。
而Linux內核,並不是唯一的,有正統的,也有非正統的(不太常見而已),而Linux內核對應的CPU結構,也有很多種,因此不同的智能手機可能有不同的CPU、不同的Linux內核和不同的安卓系統(這個系統里包含了Linux內核)
當然還有跑windows的,扯遠了,windows的手機,裡面應該可以找dll文件,這個對應安卓系統的.so文件。
還沒講so文件是幹嘛的~
那為什麼起個名字叫shareobject?
這個so文件,有時候是直接被調用的,有時候是會參與到編譯中的,也就是說,一個.so文件可能會被多個應用程序用到,因此取名叫shareobject(share:大家一起來分享使用的意思)。
這個就和windows裡面一樣,如果有時候網路下載了幾個調用dll文件的軟體,恰好電腦裡面缺這幾個dll,那麼此時,這幾個軟體將不能運行,也就是說,這幾個dll會被這幾個軟體在運行時都用到,有share的味道,所以在windows裡面叫鏈接庫,在Linux內核的系統上(可以是ubuntu啊、redhat啊,android等等)叫.so(sharedobject),作用類似,windows中起名字更嚴肅點(鏈接文件,編譯帶上它,像一條鏈條一樣),linux對它的起名更形象些(大家分享一起來用),意思差不多。當然區別肯定會有,這里只是回答得讓讀者大致理解,具體細節上的差別請另外網路。
.so文件怎麼運作的?(下面兩個步驟摘自網路)
###########################################
①編譯階段。鏈接編輯器(linkeditor)拿它和其他Relocatableobjectfile以及其他sharedobjectfile作為輸入,經鏈接處理後,生存另外的sharedobjectfile或者executablefile。
②運行階段。動態鏈接器(dynamiclinker)拿它和一個executablefile以及另外一些sharedobjectfile來一起處理,在Linux系統裡面創建一個進程映像。
這段話看起來比較抽象,如果想迅速理解它,建議讀者網路找一個gcc/g++運行helloworld的例子就理解了.
###########################################
所以大家愛吐槽啊,這個C牌子的智能手機,怎麼刷不了那個D牌手機官方系統包啊?出來各種問題,有些問題是可以解決的,有些是解決不了的,甚至會有燒機的情況。
這類問題和底層的CPU種類、Linux內核種類及版本、so文件版本等都是相關的。
所以有些牌子的智能機有通吃現象,可以刷其他牌子的各種官方系統,有的智能機則不行。
總結:
CPU和PCB外圍電路=>Linux內核+應用組件組成的安卓系統(用戶層)=>對.so文件和其他文件一起編譯=>對.so文件和其他文件一起運行=>創立進程、線程(也就是手機上的各種app和系統自帶功能)=>然後我們就可以使用手機上的各種功能了。
最後,以上回答只是為了讓讀者有初步的、粗略的、大致的理解。任何專業名詞和術語只要打了比方,就肯定是不絕對精確的。更詳細的細節,請參考專業文獻。
手機裡面的so文件,如果是應用軟體的,刪除後,應用軟體請重裝,如果是系統自帶的,請盡量不要刪除。
拋磚引玉,答得不好,請別罵,謝謝!
-----------------------------------
補充:
評論中提到了FreeBSD,我來說下怎麼回事:
操作系統=userland(用戶層)+Linux內核
Android使用的是FreeBSD內核(其實是用戶層,當然你也可以說他是內核)+Linux內核
Ubuntu使用的是GNU(用戶層)+Linux內核
用戶層啥意思:
我花了錢你不至於還讓我看底層電路底層的010101吧?買來當然是為了王者農葯對不?
通俗地講:就是屏蔽底層細節,讓客戶買來直接用.
計算機裡面為啥會有0和1?
本質是電路中的高電平和低電平,舉例:
0.5V->bit 1
0.1V->bit 0
才疏學淺,拋磚引玉,答得不好,請別罵,謝謝!
-----------------------------------
E. 什麼是SO文件
SO文件是Linux下共享庫文件,它的文件格式被稱為ELF文件格式。由於Android操作系統的底層基於Linux系統,所以SO文件可以運行在Android平台上。
Android系統也同樣開放了C/C++介面供開發者開發Native程序。由於基於虛擬機的編程語言JAVA更容易被人反編譯,因此越來越多的應用將其中的核心代碼以C/C++為編程語言,並且以SO文件的形式供上層JAVA代碼調用,以保證安全性。
(5)SO系統文件擴展閱讀:
so文件使用方法:
(1)動態庫的編譯。這里有一個頭文件:so_test.h,三個.c文件:test_a.c、test_b.c、test_c.c,我們將這幾個文件編譯成一個動態庫:libtest.so。
命令:$ gcc test_a.c test_b.c test_c.c -fPIC -shared -o libtest.so不用該標志外部程序無法連接。相當於一個可執行文件。
(2)動態庫的鏈接這里有個程序源文件 test.c 與動態庫 libtest.so 鏈接生成執行文件 test:命令:$ gcc test.c -L. -ltest -o test命令:$ ldd test執行test,可以看到它是如何調用動態庫中的函數的。
參考資料來源:網路—SO(軟體編程)