0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

c++filt命令:用于解析C++和Java中被修飾的符號(hào)

Linux愛(ài)好者 ? 來(lái)源:Linux愛(ài)好者 ? 作者:戀貓大鯉魚(yú) ? 2021-02-09 18:22 ? 次閱讀

1.命令簡(jiǎn)介

c++filt 命令可用于解析 C++ 和 Java 中被修飾的符號(hào),比如變量與函數(shù)名稱。

我們知道, 在 C++ 和 Java 中, 允許函數(shù)重載,也就是說(shuō)我們可以寫(xiě)出多個(gè)同名但參數(shù)類型不同的函數(shù),其實(shí)現(xiàn)依賴于編譯器的名字改編(Name Mangling)機(jī)制,即編譯器會(huì)將函數(shù)的名稱進(jìn)行修飾,加入?yún)?shù)信息??疾烊缦鲁绦颍?/p>

使用 g++ 編譯上面的 print.cpp 生成目標(biāo)文件 print.o。

g++-cprint.cpp-oprint.o

然后使用命令 strings 查找 print.o 中的可打印字符串。

stringsprint.o
readelf
GCC:(GNU)4.8.520150623(RedHat4.8.5-4)
.symtab
.strtab
.shstrtab
.rela.text
.data
.bss
.rodata
.rela.init_array
.comment
.note.GNU-stack
.rela.eh_frame
print.cpp
_ZStL8__ioinit
_Z41__static_initialization_and_destruction_0ii
_ZL5dTest
_GLOBAL__sub_I__Z5printRKSs
_Z5printRKSs
_ZSt4cout
_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
_ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E
_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
_ZNSolsEPFRSoS_E
_ZNSt8ios_base4InitC1Ev
__dso_handle
_ZNSt8ios_base4InitD1Ev
__cxa_atexit

找到其中兩個(gè)字符串,分別是_ZL5dTest_Z5printRKSs,根據(jù)其包含的內(nèi)容,我們大致能夠猜測(cè),兩個(gè)字符串分別對(duì)應(yīng)源碼中的常量 dTest 和函數(shù) print()。使用 c++filt 進(jìn)行符號(hào)解析(symbol demangling)來(lái)驗(yàn)證我們的猜想。

c++filt_ZL5dTest
dTest

c++filt_Z5printRKSs
print(std::basic_string,std::allocator>const&)

猜測(cè)正確,源碼文件中的變量名和函數(shù)名被修飾后,通過(guò) c++filt 命令可以還原回來(lái),這正是 c++filt 命令的功能。

2.命令格式

c++filt[-_|--strip-underscore]
[-n|--no-strip-underscore]
[-p|--no-params]
[-t|--types]
[-i|--no-verbose]
[-sformat|--format=format]
[--help][--version][symbol...]

注意,如果沒(méi)有給出符號(hào)參數(shù) [symbol…],c++filt 將從標(biāo)準(zhǔn)輸入中讀取符號(hào)名稱。

3.選項(xiàng)說(shuō)明

-_,--strip-underscore
在某些系統(tǒng)中,C和C++編譯器都在每個(gè)名字前面加下劃線。例如,C 名稱 foo 獲得低級(jí)名稱為_(kāi)foo。此選項(xiàng)用于刪除初始下劃線,c++filt 是否默認(rèn)刪除下劃線是依賴于目標(biāo)的
-n,--no-strip-underscore
不刪除初始下劃線
-p,--no-params
當(dāng)解析函數(shù)名時(shí),不顯示函數(shù)參數(shù)的類型
-t,--types
試圖解析類型與函數(shù)名
-i,--no-verbose
輸出結(jié)果中不包括任何實(shí)現(xiàn)細(xì)節(jié)
-s,--format=FORMAT
c++filt 可以解析不同編譯器修飾的符號(hào),此選項(xiàng)用于指明符號(hào)修飾所采用的方法:
"auto":根據(jù)可執(zhí)行文件自動(dòng)選擇符號(hào)解析方法,此為默認(rèn)選項(xiàng)
"gnu":GNU C++ compiler (g++)的符號(hào)修飾方法
"lucid":Lucid compiler (lcc)的符號(hào)修飾方法
"arm":C++ Annotated Reference Manual 指明的方法
"hp":HP compiler (aCC)的符號(hào)修飾方法
"edg":EDG compiler 的符號(hào)修飾方法
"gnu-v3":GNU C++ compiler (g++) with the V3 ABI 的符號(hào)修飾方法
"java":GNU Java compiler (gcj)的符號(hào)修飾方法
"gnat":GNU Ada compiler (GNAT)的符號(hào)修飾方法
--help
顯示幫助信息
--version
顯示版本信息
@FILE
從文件 FILE 中讀取命令行選項(xiàng),讀取的選項(xiàng)將插入到@FILE 選項(xiàng)的位置。如果文件不存在,或者無(wú)法讀取,那么選項(xiàng)@FILE 將被按照字面意義處理,而不是被忽略

4.常用示例

(1)解析編譯器 g++ 修飾的函數(shù)名稱。還是以第一節(jié)“1.命令簡(jiǎn)介”中函數(shù) print() 的名字為例。

c++filt-sgnu-v3_Z5printRKSs
print(std::basic_string,std::allocator>const&)

(2)解析編譯器 g++ 修飾的函數(shù)名稱,但不顯示函數(shù)參數(shù)類型。

c++filt-p_Z5printRKSs
print

(3)解析編譯器 g++ 修飾的變量名稱。還是以第一節(jié)“1.命令簡(jiǎn)介”中變量 dTest 的名字為例。

c++filt_ZL5dTest
dTest

參考文獻(xiàn)

[1] c++filt manual
[2] mangle和demangle

責(zé)任編輯:xj

原文標(biāo)題:每天一個(gè) Linux 命令(105):c++filt 命令

文章出處:【微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11212

    瀏覽量

    208724
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2102

    瀏覽量

    73453

原文標(biāo)題:每天一個(gè) Linux 命令(105):c++filt 命令

文章出處:【微信號(hào):LinuxHub,微信公眾號(hào):Linux愛(ài)好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語(yǔ)言和C++中結(jié)構(gòu)體的區(qū)別

    同樣是結(jié)構(gòu)體,看看在C語(yǔ)言和C++中有什么區(qū)別?
    的頭像 發(fā)表于 10-30 15:11 ?104次閱讀

    C7000優(yōu)化C/C++編譯器

    電子發(fā)燒友網(wǎng)站提供《C7000優(yōu)化C/C++編譯器.pdf》資料免費(fèi)下載
    發(fā)表于 10-30 09:45 ?0次下載
    <b class='flag-5'>C</b>7000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器

    C語(yǔ)言與Java語(yǔ)言的對(duì)比

    C語(yǔ)言和Java語(yǔ)言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨(dú)特的優(yōu)勢(shì)和特點(diǎn),適用于不同的應(yīng)用場(chǎng)景。以下將從語(yǔ)法特性、內(nèi)存管理、跨平臺(tái)性、性能、應(yīng)用領(lǐng)域等多個(gè)方面對(duì)C語(yǔ)言和
    的頭像 發(fā)表于 10-29 17:31 ?140次閱讀

    C++語(yǔ)言基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《C++語(yǔ)言基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?6次下載

    C++中實(shí)現(xiàn)類似instanceof的方法

    C++有多態(tài)與繼承,但是很多人開(kāi)始學(xué)習(xí)C++,有時(shí)候會(huì)面臨一個(gè)常見(jiàn)問(wèn)題,就是如何向下轉(zhuǎn)型,特別是不知道具體類型的時(shí)候,這個(gè)時(shí)候就希望C++ 可以向Java或者Python中有insta
    的頭像 發(fā)表于 07-18 10:16 ?509次閱讀
    <b class='flag-5'>C++</b>中實(shí)現(xiàn)類似instanceof的方法

    鴻蒙OS開(kāi)發(fā)實(shí)例:【Native C++

    使用DevEco Studio創(chuàng)建一個(gè)Native C++應(yīng)用。應(yīng)用采用Native C++模板,實(shí)現(xiàn)使用NAPI調(diào)用C標(biāo)準(zhǔn)庫(kù)的功能。使用C標(biāo)準(zhǔn)庫(kù)hypot接口計(jì)算兩個(gè)給定數(shù)平方和的平
    的頭像 發(fā)表于 04-14 11:43 ?2454次閱讀
    鴻蒙OS開(kāi)發(fā)實(shí)例:【Native <b class='flag-5'>C++</b>】

    c語(yǔ)言,c++,java,python區(qū)別

    C語(yǔ)言、C++、Java和Python是四種常見(jiàn)的編程語(yǔ)言,各有優(yōu)點(diǎn)和特點(diǎn)。 C語(yǔ)言: C語(yǔ)言是一種面向過(guò)程的編程語(yǔ)言。它具有底層的特性,能
    的頭像 發(fā)表于 02-05 14:11 ?2141次閱讀

    C++簡(jiǎn)史:C++是如何開(kāi)始的

    MISRA C++:2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本,來(lái)了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工程師 Frank van den Beuken 博士撰寫(xiě)
    的頭像 發(fā)表于 01-11 09:00 ?514次閱讀
    <b class='flag-5'>C++</b>簡(jiǎn)史:<b class='flag-5'>C++</b>是如何開(kāi)始的

    C語(yǔ)言和C++中那些不同的地方

    C語(yǔ)言雖說(shuō)經(jīng)常和C++在一起被大家提起,但可千萬(wàn)不要以為它們是一個(gè)東西。現(xiàn)在我們常用的C語(yǔ)言是C89標(biāo)準(zhǔn),C++
    的頭像 發(fā)表于 12-07 14:29 ?890次閱讀
    <b class='flag-5'>C</b>語(yǔ)言和<b class='flag-5'>C++</b>中那些不同的地方

    eclipse怎么使用命令

    Eclipse是一種功能強(qiáng)大的集成開(kāi)發(fā)環(huán)境(IDE),可用于開(kāi)發(fā)各種類型的應(yīng)用程序,包括Java、C/C++、Python等。雖然Eclipse提供了用戶友好的圖形用戶界面,但有時(shí)候我
    的頭像 發(fā)表于 12-06 11:26 ?2352次閱讀

    如何選擇創(chuàng)建c語(yǔ)言和c++

    選擇創(chuàng)建 C 語(yǔ)言和 C++ 都需要綜合考慮多個(gè)因素。在決定使用哪種語(yǔ)言之前,我們需要對(duì)這兩種語(yǔ)言的特點(diǎn)、優(yōu)缺點(diǎn)、適用場(chǎng)景、學(xué)習(xí)成本等進(jìn)行全面的了解和對(duì)比。下面是關(guān)于選擇創(chuàng)建 C 語(yǔ)言和 C+
    的頭像 發(fā)表于 11-27 15:58 ?559次閱讀

    c++怎么開(kāi)始編程

    C++是一種高級(jí)的、通用的編程語(yǔ)言,用于開(kāi)發(fā)各種類型的應(yīng)用程序。它是從C語(yǔ)言演變而來(lái),也是一種靜態(tài)類型語(yǔ)言,可以在不同的平臺(tái)上進(jìn)行開(kāi)發(fā)。C++具有高度的靈活性和性能,并且廣泛應(yīng)
    的頭像 發(fā)表于 11-27 15:56 ?876次閱讀

    c++多行注釋快捷鍵

    C++中,多行注釋(也稱為塊注釋)是一種用于注釋大段代碼或多個(gè)語(yǔ)句的方法。當(dāng)你希望暫時(shí)禁用一些代碼或者解釋特定部分代碼的作用時(shí),多行注釋是非常有用的。 在C++中,多行注釋以 /* 開(kāi)始,以
    的頭像 發(fā)表于 11-22 10:24 ?7945次閱讀

    java內(nèi)部類可以用public修飾

    Java的內(nèi)部類是指一個(gè)類被定義在另一個(gè)類的內(nèi)部。根據(jù)定義的位置和訪問(wèn)權(quán)限的不同,內(nèi)部類可以分為四種:成員內(nèi)部類、靜態(tài)內(nèi)部類、方法內(nèi)部類和匿名內(nèi)部類。 內(nèi)部類的訪問(wèn)權(quán)限 成員內(nèi)部類和靜態(tài)內(nèi)部類可以
    的頭像 發(fā)表于 11-21 10:23 ?1046次閱讀

    C/C++語(yǔ)言學(xué)習(xí)大全套

    電子發(fā)燒友網(wǎng)站提供《C/C++語(yǔ)言學(xué)習(xí)大全套.rar》資料免費(fèi)下載
    發(fā)表于 11-18 14:33 ?4次下載
    <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>語(yǔ)言學(xué)習(xí)大全套