新聞中心
在編寫代碼的過程中,有些符號(hào)可能會(huì)對(duì)代碼運(yùn)行產(chǎn)生影響,甚至導(dǎo)致程序崩潰。因此,有時(shí)候我們需要在代碼中屏蔽掉一些符號(hào),從而確保程序的穩(wěn)定性和正確性。本文將介紹如何在Linux中屏蔽代碼中的符號(hào)。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供宏偉網(wǎng)站建設(shè)、宏偉做網(wǎng)站、宏偉網(wǎng)站設(shè)計(jì)、宏偉網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、宏偉企業(yè)網(wǎng)站模板建站服務(wù),十余年宏偉做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
一、什么是符號(hào)
在編寫程序時(shí),我們經(jīng)常會(huì)使用各種各樣的符號(hào),如變量、函數(shù)等等。這些符號(hào)都是程序運(yùn)行的基礎(chǔ),也是程序的組成部分。通常稱這些符號(hào)為符號(hào)表。
符號(hào)表存儲(chǔ)了程序中所有的符號(hào)信息,包括變量的名字、地址、類型等等。符號(hào)表是一個(gè)非常重要的結(jié)構(gòu),它被編譯器和連接器用來生成可執(zhí)行文件。符號(hào)表還可以用于調(diào)試,我們可以通過符號(hào)表來定位代碼中的錯(cuò)誤。
二、為什么需要屏蔽符號(hào)
雖然符號(hào)表對(duì)編譯、鏈接和調(diào)試都非常重要,但有時(shí)候符號(hào)表中的一些符號(hào)可能會(huì)對(duì)程序的運(yùn)行產(chǎn)生負(fù)面影響,比如:
1、符號(hào)沖突
當(dāng)兩個(gè)或多個(gè)函數(shù)或變量的名字相同,但它們的作用域不同,可能會(huì)導(dǎo)致符號(hào)沖突。例如,在兩個(gè)不同的文件中,都定義了一個(gè)名為“foo”的函數(shù),則會(huì)導(dǎo)致符號(hào)沖突,編譯器會(huì)報(bào)錯(cuò)。
2、符號(hào)重定義
如果我們?cè)谕粋€(gè)文件中定義了兩個(gè)同名的函數(shù)或變量,則會(huì)導(dǎo)致符號(hào)重定義錯(cuò)誤。這種情況通常是由于疏忽或者復(fù)制粘貼代碼時(shí)出現(xiàn)的錯(cuò)誤。
3、符號(hào)泄露
符號(hào)泄漏是指在程序運(yùn)行時(shí),未使用的符號(hào)被暴露出來,從而可能會(huì)引起安全問題。攻擊者可以利用泄漏的符號(hào)來獲取程序的敏感信息或者執(zhí)行惡意代碼。
因此,當(dāng)我們遇到以上問題時(shí),需要屏蔽一些符號(hào),從而確保程序的穩(wěn)定性和正確性。
三、如何屏蔽符號(hào)
在Linux中,我們可以通過以下幾種方式來屏蔽符號(hào):
1、使用編譯器選項(xiàng)
GCC編譯器提供了一個(gè)”-fvisibility”選項(xiàng),可以控制函數(shù)和變量的可見性。該選項(xiàng)默認(rèn)為”hidden”,可以將函數(shù)和變量設(shè)為不可見,從而屏蔽掉一些符號(hào)。
例如,我們可以在函數(shù)定義前加上如下指令:
“`c
__attribute__((visibility(“hidden”))) void foo() {}
“`
這樣,函數(shù)”foo”就不會(huì)被其他文件引用,從而達(dá)到屏蔽符號(hào)的目的。
2、使用objcopy命令
objcopy是一個(gè)可以用來復(fù)制、轉(zhuǎn)換目標(biāo)文件格式的命令。我們可以使用該命令來重命名、刪除符號(hào)表,從而屏蔽掉一些符號(hào)。
例如,我們可以使用如下命令來刪除文件”libtest.so”中名為”foo”的符號(hào):
“`shell
objcopy –strip-symbol=foo libtest.so libtest.so
“`
這樣,”libtest.so”中的”foo”符號(hào)就被刪除了,從而達(dá)到屏蔽符號(hào)的目的。
3、使用LD_PRELOAD環(huán)境變量
LD_PRELOAD環(huán)境變量可以用來指定一個(gè)共享庫,該庫會(huì)優(yōu)先于其他庫被加載到內(nèi)存中。我們可以利用這個(gè)特性,來屏蔽掉一些函數(shù)。
例如,我們可以編寫一個(gè)共享庫”libmymath.so”,在該庫中實(shí)現(xiàn)一個(gè)名為”open”的函數(shù),將其編譯并在LD_PRELOAD環(huán)境變量中指定。
“`c
int open(const char* pathname, int flags){
printf(“open() is disabled\n”);
return -1;
}
“`
這樣,當(dāng)程序中調(diào)用”open”函數(shù)時(shí),實(shí)際上會(huì)調(diào)用”libmymath.so”中的”open”函數(shù),從而達(dá)到屏蔽函數(shù)的目的。
四、
在Linux中,屏蔽代碼中的符號(hào)是保證程序穩(wěn)定性和正確性的重要手段。本文介紹了三種常用的屏蔽符號(hào)的方法:使用編譯器選項(xiàng)、使用objcopy命令和使用LD_PRELOAD環(huán)境變量。在實(shí)際應(yīng)用中,我們可以根據(jù)具體的情況選擇合適的方法來屏蔽符號(hào)。
相關(guān)問題拓展閱讀:
- 列舉linux系統(tǒng)的4種文件類型及其屬性符號(hào)
列舉linux系統(tǒng)的4種文件類型及其屬性符號(hào)
一. 文件類型
Linux文件類型常見的有:普通文件、目錄文件、字符設(shè)備文件和塊設(shè)備文件、符納蠢號(hào)鏈接文件等,現(xiàn)在我們進(jìn)行一個(gè)簡(jiǎn)要的說明。
1. 普通文件
我們用 ls -lh 來查看某個(gè)文件的屬性,可以看到有類似-rwxrwxrwx,值得注意的是之一個(gè)符號(hào)是 – ,這樣的文件在Linux中就是普通文件。這些文件一般是用一些相關(guān)的應(yīng)用程序創(chuàng)建,比如圖像工具、文檔工具、歸檔工具… …. 或 cp工具等。這類文件的刪除方式是用rm 命令。 另外,依照文件的內(nèi)容,又大略可以分為:
1>. 純文本檔(ASCII):
這是Linux系統(tǒng)中最多的一種文件類型,稱為純文本檔是因?yàn)閮?nèi)容為我們?nèi)祟惪梢灾苯幼x到的數(shù)據(jù),例如數(shù)字、字母等等。 幾乎只要我們可以用來做為設(shè)定的文件都屬于這一種文件類型。 舉例來說,你可以用命令: cat ~/.bashrc 來看到該文件的內(nèi)容。 (cat 是將一個(gè)文件內(nèi)容讀出來的指令).
2>. 二進(jìn)制文件(binary):
Linux系統(tǒng)其實(shí)僅認(rèn)識(shí)且可以執(zhí)行二進(jìn)制文件(binary file)。Linux當(dāng)中的可執(zhí)行文件(scripts, 文字型批處理文件不算)就是這種格式的文件。 剛剛使用的命令cat就是一個(gè)binary file。
3>. 數(shù)據(jù)格式文件(data):
有些程序在運(yùn)作的過程當(dāng)中會(huì)讀取某些特定格式的文件,那些特定格式的文件可以被稱為數(shù)據(jù)文件 (data file)。舉例來說,我們的Linux在使用者登錄時(shí),都會(huì)將登錄的數(shù)據(jù)記錄在 /var/log/wtmp那個(gè)文件內(nèi),該文件是一個(gè)data file,他能夠透過last這個(gè)指令讀出來! 但是使用cat時(shí),會(huì)讀出亂碼~因?yàn)樗菍儆谝环N特殊格式的文件?
2. 目錄文件
當(dāng)我們?cè)谀硞€(gè)目錄下執(zhí)行,看到有類似 drwxr-xr-x ,這樣的文件洞侍陪就是目錄,目錄在Linux是一個(gè)比較特殊的文件。注意它的之一個(gè)字符是d。創(chuàng)建目錄的命令可以用 mkdir 命令,或cp命令,cp可以把一個(gè)目錄復(fù)制為另一個(gè)目錄。刪除用rm 或rmdir命令。
3. 字符設(shè)備或塊設(shè)備文件
如時(shí)您進(jìn)入/dev目錄,列一下文件,會(huì)看到類似如下的:
復(fù)制代碼
代碼如下:
# ls -al /dev/tty
crw-rw-rw- 1 root tty 5,:11 /dev/tty
# ls -la /dev/sda1
brw-rroot disk 8,:11 /dev/sda1
我們看到/dev/tty的屬性是 crw-rw-rw- ,注意前面之一個(gè)字符是 c ,這表示字符設(shè)備文件。比如貓等串口設(shè)備。我們看到 /dev/sda1 的屬性是 brw-r—– ,注意前面的之一個(gè)字符是b,這表示塊設(shè)備,比如硬盤,光驅(qū)等設(shè)備。
這個(gè)種類的文件,是用mknode來創(chuàng)建,用rm來刪談態(tài)除。目前在最新的Linux發(fā)行版本中,我們一般不用自己來創(chuàng)建設(shè)備文件。因?yàn)檫@些文件是和內(nèi)核相關(guān)聯(lián)的。
與系統(tǒng)周邊及儲(chǔ)存等相關(guān)的一些文件, 通常都集中在/dev這個(gè)目錄之下!通常又分為兩種:
區(qū)塊(block)設(shè)備檔 :
就是一些儲(chǔ)存數(shù)據(jù), 以提供系統(tǒng)隨機(jī)存取的接口設(shè)備,舉例來說,硬盤與軟盤等就是啦! 你可以隨機(jī)的在硬盤的不同區(qū)塊讀寫,這種裝置就是成組設(shè)備!你可以自行查一下/dev/sda看看, 會(huì)發(fā)現(xiàn)之一個(gè)屬性為!
字符(character)設(shè)備文件:
亦即是一些串行端口的接口設(shè)備, 例如鍵盤、鼠標(biāo)等等!這些設(shè)備的特色就是一次性讀取的,不能夠截?cái)噍敵觥?舉例來說,你不可能讓鼠標(biāo)跳到另一個(gè)畫面,而是滑動(dòng)到另一個(gè)地方!之一個(gè)屬性為 。
4. 數(shù)據(jù)接口文件(sockets):
數(shù)據(jù)接口文件(或者:套接口文件),這種類型的文件通常被用在網(wǎng)絡(luò)上的數(shù)據(jù)承接了。我們可以啟動(dòng)一個(gè)程序來監(jiān)聽客戶端的要求, 而客戶端就可以透過這個(gè)socket來進(jìn)行數(shù)據(jù)的溝通了。之一個(gè)屬性為 , 最常在/var/run這個(gè)目錄中看到這種文件類型了。
例如:當(dāng)我們啟動(dòng)MySQL服務(wù)器時(shí),會(huì)產(chǎn)生一個(gè)mysql.sock的文件。
復(fù)制代碼
代碼如下:
# ls -lh /var/lib/mysql/mysql.sock
srwxrwxrwx 1 mysql mysql:12 /var/lib/mysql/mysql.sock
注意這個(gè)文件的屬性的之一個(gè)字符是 s。
5. 符號(hào)鏈接文件:
當(dāng)我們查看文件屬性時(shí),會(huì)看到有類似 lrwxrwxrwx,注意之一個(gè)字符是l,這類文件是鏈接文件。是通過ln -s 源文件名 新文件名 。上面是一個(gè)例子,表示setup.log是install.log的軟鏈接文件。怎么理解呢?這和Windows操作系統(tǒng)中的快捷方式有點(diǎn)相似。
符號(hào)鏈接文件的創(chuàng)建方法舉例:
復(fù)制代碼
代碼如下:
# ls -lh log2023.log
-rw-r–r– 1 root root 296K:03 log2023.log
# ln -s log2023.log linklog.log
# ls -lh *.log
lrwxrwxrwx 1 root root:58 linklog.log -> log2023.log
-rw-r–r– 1 root root 296K:03 log2023.log
6. 數(shù)據(jù)輸送文件(FIFO,pipe):
FIFO也是一種特殊的文件類型,他主要的目的在解決多個(gè)程序同時(shí)存取一個(gè)文件所造成的錯(cuò)誤問題。 FIFO是first-in-first-out的縮寫。之一個(gè)屬性為
。
鏈接 l
字符設(shè)備 c
塊設(shè)備 b
普通文件 –
linux 屏蔽代碼符號(hào)的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux 屏蔽代碼符號(hào),如何在Linux中屏蔽代碼中的符號(hào)?,列舉linux系統(tǒng)的4種文件類型及其屬性符號(hào)的信息別忘了在本站進(jìn)行查找喔。
成都網(wǎng)站推廣找創(chuàng)新互聯(lián),老牌網(wǎng)站營銷公司
成都網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián)(www.cdcxhl.com)專注高端網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì)制作,網(wǎng)站維護(hù),網(wǎng)絡(luò)營銷,SEO優(yōu)化推廣,快速提升企業(yè)網(wǎng)站排名等一站式服務(wù)。IDC基礎(chǔ)服務(wù):云服務(wù)器、虛擬主機(jī)、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗(yàn)、服務(wù)器租用、服務(wù)器托管提供四川、成都、綿陽、雅安、重慶、貴州、昆明、鄭州、湖北十堰機(jī)房互聯(lián)網(wǎng)數(shù)據(jù)中心業(yè)務(wù)。
本文名稱:如何在Linux中屏蔽代碼中的符號(hào)? (linux 屏蔽代碼符號(hào))
網(wǎng)頁網(wǎng)址:http://fisionsoft.com.cn/article/dhjcgpo.html


咨詢
建站咨詢
