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

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

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

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

Linux愛好者 ? 來源:Linux愛好者 ? 作者:戀貓大鯉魚 ? 2021-02-09 18:22 ? 次閱讀

1.命令簡介

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

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

使用 g++ 編譯上面的 print.cpp 生成目標文件 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

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

c++filt_ZL5dTest
dTest

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

猜測正確,源碼文件中的變量名和函數(shù)名被修飾后,通過 c++filt 命令可以還原回來,這正是 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...]

注意,如果沒有給出符號參數(shù) [symbol…],c++filt 將從標準輸入中讀取符號名稱。

3.選項說明

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

4.常用示例

(1)解析編譯器 g++ 修飾的函數(shù)名稱。還是以第一節(jié)“1.命令簡介”中函數(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.命令簡介”中變量 dTest 的名字為例。

c++filt_ZL5dTest
dTest

參考文獻

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

責任編輯:xj

原文標題:每天一個 Linux 命令(105):c++filt 命令

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


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

    關(guān)注

    87

    文章

    11327

    瀏覽量

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

    關(guān)注

    22

    文章

    2113

    瀏覽量

    73742

原文標題:每天一個 Linux 命令(105):c++filt 命令

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

收藏 人收藏

    評論

    相關(guān)推薦

    Spire.XLS for C++組件說明

    Spire.XLS for C++ 是一款專業(yè)的 C++ Excel 組件,可以用在各種 C++ 框架和應(yīng)用程序中。Spire.XLS for C++ 提供了一個對象模型 Excel
    的頭像 發(fā)表于 01-14 09:40 ?68次閱讀
    Spire.XLS for <b class='flag-5'>C++</b>組件說明

    同樣是函數(shù),在CC++中有什么區(qū)別

    同樣是函數(shù),在 CC++ 中有什么區(qū)別? 第一個返回值。 C語言的函數(shù)可以不寫返回值類型,編譯器會默認為返回 int。 但是 C++ 的函數(shù),除了構(gòu)造和析構(gòu)這兩個特殊的函數(shù),必須
    的頭像 發(fā)表于 11-29 10:25 ?389次閱讀

    C7000 C/C++優(yōu)化指南用戶手冊

    電子發(fā)燒友網(wǎng)站提供《C7000 C/C++優(yōu)化指南用戶手冊.pdf》資料免費下載
    發(fā)表于 11-09 15:00 ?0次下載
    <b class='flag-5'>C</b>7000 <b class='flag-5'>C</b>/<b class='flag-5'>C++</b>優(yōu)化指南用戶手冊

    TMS320C6000優(yōu)化C/C++編譯器v8.3.x

    電子發(fā)燒友網(wǎng)站提供《TMS320C6000優(yōu)化C/C++編譯器v8.3.x.pdf》資料免費下載
    發(fā)表于 11-01 09:35 ?0次下載
    TMS320<b class='flag-5'>C</b>6000優(yōu)化<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>編譯器v8.3.x

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

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

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

    電子發(fā)燒友網(wǎng)站提供《C7000優(yōu)化C/C++編譯器.pdf》資料免費下載
    發(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語言與Java語言的對比

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

    OpenHarmony標準系統(tǒng)C++公共基礎(chǔ)類庫案例:HelloWorld

    1、程序簡介該程序是基于凌蒙派OpenHarmony-v3.2.1標準系統(tǒng)C++公共基礎(chǔ)類庫的簡單案例:HelloWorld。主要講解C++公共基礎(chǔ)類庫案例如何搭建和編譯。2、程序解析2.1、創(chuàng)建
    的頭像 發(fā)表于 08-13 08:23 ?550次閱讀
    OpenHarmony標準系統(tǒng)<b class='flag-5'>C++</b>公共基礎(chǔ)類庫案例:HelloWorld

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

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

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

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

    C/C++代碼動態(tài)測試工具VectorCAST插樁功能演示#代碼動態(tài)測試 #C++

    C++代碼
    北匯信息POLELINK
    發(fā)布于 :2024年04月18日 11:57:45

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

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

    使用 MISRA C++:2023? 避免基于范圍的 for 循環(huán)中的錯誤

    在前兩篇博客中,我們?向您介紹了新的 MISRA C++ 標準?和?C++ 的歷史?。在這篇博客中,我們將仔細研究以 C++ 中?for?循環(huán)為中心的特定規(guī)則。
    的頭像 發(fā)表于 03-28 13:53 ?834次閱讀
    使用 MISRA <b class='flag-5'>C++</b>:2023? 避免基于范圍的 for 循環(huán)中的錯誤

    嵌入式C語言面試大挑戰(zhàn)

    C++中static關(guān)鍵字除了具有C中的作用還有在類中的使用在類中,static可以用來修飾靜態(tài)數(shù)據(jù)成員和靜態(tài)成員方法靜態(tài)數(shù)據(jù)成員
    發(fā)表于 03-05 14:18 ?376次閱讀
    嵌入式<b class='flag-5'>C</b>語言面試大挑戰(zhàn)

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

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