動(dòng)態(tài)庫(kù)全局變量同名 linux動(dòng)態(tài)鏈接庫(kù)里全局變量和靜態(tài)變量會(huì)導(dǎo)致動(dòng)態(tài)庫(kù)不可重入嗎?
linux動(dòng)態(tài)鏈接庫(kù)里全局變量和靜態(tài)變量會(huì)導(dǎo)致動(dòng)態(tài)庫(kù)不可重入嗎?靜態(tài)變量在每次被調(diào)用其值被修改了,下次讀取的初始值為上次修改的結(jié)果。如在函數(shù)中的局部靜態(tài)變量static int a,初始為0。當(dāng)被一個(gè)
linux動(dòng)態(tài)鏈接庫(kù)里全局變量和靜態(tài)變量會(huì)導(dǎo)致動(dòng)態(tài)庫(kù)不可重入嗎?
靜態(tài)變量在每次被調(diào)用其值被修改了,下次讀取的初始值為上次修改的結(jié)果。
如在函數(shù)中的局部靜態(tài)變量static int a,初始為0。當(dāng)被一個(gè)函數(shù)調(diào)用并且修改為1,則下一次被另一個(gè)函數(shù)調(diào)用是初始值這變?yōu)?。所以每次a的值都有可能發(fā)生變化。linux系統(tǒng)中,初始化的全局變量和未初始化過的全局變量保存在哪?
一個(gè)由C/C 編譯的程序占用的內(nèi)存分為以下幾個(gè)部分1、棧區(qū)(stack)—由編譯器自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。2、堆區(qū)(heap)—一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時(shí)可能由OS回收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事,分配方式倒是類似于鏈表,呵呵。3、全局區(qū)(靜態(tài)區(qū))(static)—,全局變量和靜態(tài)變量的存儲(chǔ)是放在一塊的,初始化的全局變量和靜態(tài)變量在一塊區(qū)域,未初始化的全局變量和未初始化的靜態(tài)變量在相鄰的另一塊區(qū)域。-程序結(jié)束后由系統(tǒng)釋放。4、文字常量區(qū)—常量字符串就是放在這里的。程序結(jié)束后由系統(tǒng)釋放5、程序代碼區(qū)—存放函數(shù)體的二進(jìn)制代碼。
如何查看linux動(dòng)態(tài)庫(kù)中包含哪些函數(shù)?
主要有兩種方法,如下:
1、方法1 nm *.so
2、方法2 readelf -a *.so
說明:
nm可列出.o .a .so中的符號(hào)信息,包括諸如符號(hào)的值,符號(hào)類型及符號(hào)名稱等。所謂符號(hào),通常指定義出的函數(shù),全局變量等等。
示例說明 :
nm -D libname.so
nm [option(s)] [file(s)]
有用的options:
-A 在每個(gè)符號(hào)信息的前面打印所在對(duì)象文件名稱;
-C 輸出demangle過了的符號(hào)名稱;
-D 打印動(dòng)態(tài)符號(hào);
-l 使用對(duì)象文件中的調(diào)試信息打印出所在源文件及行號(hào);
-n 按照地址/符號(hào)值來排序;
-u 打印出那些未定義的符號(hào);
簡(jiǎn)述gcc編譯時(shí)使用靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別?
重新編輯一下吧,用gcc去試試它的選項(xiàng)吧,簡(jiǎn)單點(diǎn)說靜態(tài)庫(kù)就是你在生成程序時(shí)直接編成代碼集成到你生成的可執(zhí)行程序里面去了,而動(dòng)態(tài)庫(kù)卻不會(huì),所以兩種情況下生成的可執(zhí)行程序是不一樣的。在程序運(yùn)行時(shí),操作系統(tǒng)會(huì)為每一個(gè)進(jìn)程生成一片進(jìn)程空間,也就是進(jìn)程擁有了自己的一片內(nèi)存,如果你的進(jìn)程在用gcc生成的時(shí)候l了一下,這時(shí)候操作系統(tǒng)會(huì)根據(jù)環(huán)境變量找到同名動(dòng)態(tài)庫(kù),并將其里面的代碼以及全局變量等信息copy一份到內(nèi)存中,也就是運(yùn)行中加載了,如果你想了解更多的話,學(xué)習(xí)編譯鏈接裝載了,程序員的自我修養(yǎng)咯,要不去學(xué)習(xí)學(xué)習(xí)elf是什么樣的標(biāo)準(zhǔn)唄,看看反匯編代碼也不錯(cuò),祝你好運(yùn)搞的知乎跟技術(shù)分享會(huì)一樣的了,鏈接不鏈接,自己去看啊,linux沒有手冊(cè)?。烤W(wǎng)上沒有講這些的文章???自己不會(huì)動(dòng)手操作???還是你想告訴我你是小白一枚?如果是小白那你回去看書啊,圖靈書籍那么多,不知道買來看?
linux驅(qū)動(dòng)開發(fā)使用全局變量都有哪些壞處?
即使是靜態(tài)的,全局變量還是越少越好。
不光是linux,裸機(jī)上也是這樣。把相關(guān)的變量放到一個(gè)結(jié)構(gòu)體里,在使用時(shí)再動(dòng)態(tài)劃分,這樣減小了代碼的總體大小,因而也節(jié)省了內(nèi)存。更方便調(diào)試。以前調(diào)試出現(xiàn)過類似的情景,因?yàn)樽约簩懙逆溄幽_本中未包含 common 段,出現(xiàn)全局變量為隨機(jī)值的情況。你可能懷疑直接使用static 變量比用機(jī)構(gòu)體效率更高,其實(shí)不然,結(jié)構(gòu)體傳來傳去的參數(shù)轉(zhuǎn)換都是在編譯時(shí)就解決的,對(duì)運(yùn)行時(shí)影響不大。學(xué) linux 的都是我的朋友,歡迎交流