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