導航:首頁 > 程序命令 > readelf命令

readelf命令

發布時間:2023-02-19 00:00:12

㈠ so中導出符號與非導出符號怎麼查看

什麼是導出符號?

符號,是軟體鏈接過程的用到的術語。
我們編寫自己的軟體生成目標文件,通常情況下,只有自己的目標文件是不夠的。

比如我們用c++編寫的程序,必然要與C++的運行時庫鏈接在一起才能工作,否
則我們在代碼中使用的fopen或者std::cout之類的符號要到哪裡去找。

在鏈接的過程中,相當於是讓目標文件之間鑲嵌到一起,因此最重要的是找到精
確的接入點,這就是符號。
ldd命令:
ldd命令用於輸出可執行文件或者庫文件所依賴的共享庫列表。

nm命令:
nm命令用於輸出可執行文件或者庫文件的符號表。

readelf命令:
readelf命令用來顯示一個或者多個elf格式的目標文件的信息,可以通過它的選項來控制顯示哪些信息。
常用的選項:

-s --syms --symbols 顯示符號表段中的項(如果有的話)。
-d --dynamic 顯示動態段的信息。
1
2
1
2
ar命令:
ar命令可以用來創建、修改庫,也可以從庫中提出單個模塊。

objmp命令:
objmp命令是用查看目標文件或者可執行的目標文件的構成的gcc工具。
常用選項:

-T --dynamic-syms
1
1
顯示文件的動態符號表入口,僅僅對動態目標文件意義,比如某些共享庫。它顯示的信息類似於 nm -D|–dynamic 顯示的

linux源碼包怎麼查看依賴關系

一、可執行文件/二進制文件依賴共享庫
ldd命令用來查看可執行文件依賴的共享庫文件。
$ ldd --help
Usage: ldd [OPTION]... FILE...
--help print this help and exit
--version print version information and exit
-d, --data-relocs process data relocations
-r, --function-relocs process data and function relocations
-u, --unused print unused direct dependencies
-v, --verbose print all information
示例:
$ ldd helloworld
二、共享庫依賴共享庫關系
上面的ldd命令無法查看共享庫的依賴關系,因為共享庫本身並不是可執行文件,我們可以使用

objmp -x libhelloworld.so | grep NEEDED
其中,libhelloworld.so是你的庫名稱。
附:
readelf命令用於讀取ELF Header信息

㈢ 查詢linux應用程序運行依賴哪些庫

在x86下,為了查看程序所依賴的庫,可以使用ldd命令
但如果是使用arm-linux-gcc 等交叉編譯環境編譯出來的程序,則要使用readelf命令來查看了

㈣ andriod系統里怎麼使用readelf命令

readelf <option(s)> elf-file(s)

[功能]
用於顯示elf格式文件的信息。

[描述]
readelf用來顯示一個或者多個elf格式的目標文件的信息,可以通過它的選項來控制顯示哪些信息。這里的elf-file(s)就表示那些被檢查的文件。可以支持32位,64位的elf格式文件,也支持包含elf文件的文檔(這里一般指的是使用ar命令將一些elf文件打包之後生成的例如lib*.a之類的「靜態庫」文件)。
這個程序和objmp提供的功能類似,但是它顯示的信息更為具體,並且它不依賴BFD庫(BFD庫是一個GNU項目,它的目標就是希望通過一種統一的介面來處理不同的目標文件),所以即使BFD庫有什麼bug存在的話也不會影響到readelf程序。
運行readelf的時候,除了-v和-H之外,其它的選項必須有一個被指定。

ELF文件類型:
種類型的ELF文件:
a)可重定位文件:用戶和其他目標文件一起創建可執行文件或者共享目標文件,例如lib*.a文件。
b)可執行文件:用於生成進程映像,載入內存執行,例如編譯好的可執行文件a.out。
c)共享目標文件:用於和其他共享目標文件或者可重定位文件一起生成elf目標文件或者和執行文件一起創建進程映像,例如lib*.so文件。

ELF文件作用:
ELF文件參與程序的連接(建立一個程序)和程序的執行(運行一個程序),所以可以從不同的角度來看待elf格式的文件:
a)如果用於編譯和鏈接(可重定位文件),則編譯器和鏈接器將把elf文件看作是節頭表描述的節的集合,程序頭表可選。
b)如果用於載入執行(可執行文件),則載入器則將把elf文件看作是程序頭表描述的段的集合,一個段可能包含多個節,節頭表可選。
c)如果是共享文件,則兩者都含有。

ELF文件總體組成:
elf文件頭描述elf文件的總體信息。包括:
系統相關,類型相關,載入相關,鏈接相關。
系統相關表示:elf文件標識的魔術數,以及硬體和平台等相關信息,增加了elf文件的移植性,使交叉編譯成為可能。
類型相關就是前面說的那個類型。
載入相關:包括程序頭表相關信息。
鏈接相關:節頭表相關信息。

項(分別以長格式和短格式給出了):
-a
--all 顯示全部信息,等價於 -h -l -S -s -r -d -V -A -I.

-h
--file-header 顯示elf文件開始的文件頭信息.

-l
--program-headers
--segments 顯示程序頭(段頭)信息(如果有的話)。

-S
--section-headers
--sections 顯示節頭信息(如果有的話)。

-g
--section-groups 顯示節組信息(如果有的話)。

-t
--section-details 顯示節的詳細信息(-S的)。

-s
--syms
--symbols 顯示符號表段中的項(如果有的話)。

-e
--headers 顯示全部頭信息,等價於: -h -l -S

-n
--notes 顯示note段(內核注釋)的信息。

-r
--relocs 顯示可重定位段的信息。

-u
--unwind 顯示unwind段信息。當前只支持IA64 ELF的unwind段信息。

-d
--dynamic 顯示動態段的信息。

-V
--version-info 顯示版本段的信息。

-A
--arch-specific 顯示CPU構架信息。

-D
--use-dynamic 使用動態段中的符號表顯示符號,而不是使用符號段。

-x <number or name>
--hex-mp=<number or name> 以16進制方式顯示指定段內內容。number指定段表中段的索引,或字元串指定文件中的段名。

-w[liaprmfFsoR] or
--debug-mp[=line,=info,=abbrev,=pubnames,=aranges,=macro,=frames,=frames-interp,=str,=loc,=Ranges]
顯示調試段中指定的內容。

-I
--histogram 顯示符號的時候,顯示bucket list長度的柱狀圖。

-v
--version 顯示readelf的版本信息。

-H
--help 顯示readelf所支持的命令行選項。

-W
--wide 寬行輸出。

@file 可以將選項集中到一個文件中,然後使用這個@file選項載入。

[舉例]
先給出如下例子:
1,對於可執行文件形式的elf格式文件:
1)查看可執行程序的源代碼如下:
[quietheart@lv-k cppDemo]$ cat main.cpp
#include <iostream>
using std::cout;
using std::endl;
void my_print();

int main(int argc, char *argv[])
{
my_print();
cout<<"hello!"<<endl;
return 0;
}

void my_print()
{
cout<<"print!"<<endl;
}

2)編譯如下:
[quietheart@lv-k cppDemo]$ g++ main.cpp -o main
[quietheart@lv-k cppDemo]$ g++ -g main.cpp -o main.debug

3)編譯之後,查看生成的文件:
[quietheart@lv-k cppDemo]$ ls -l
總計 64
-rwxr-xr-x 1 quietheart quietheart 6700 07-07 18:04 main
-rw-r--r-- 1 quietheart quietheart 201 07-07 18:02 main.cpp
-rwxr-xr-x 1 quietheart quietheart 38932 07-07 18:04 main.debug
這里,main.debug是帶有調試信息的可執行文件,main是一般的可執行文件。

2,對於庫文件形式的elf格式文件:
1)查看庫的源代碼如下:
//myfile.h
#ifndef __MYFILE_H
#define __MYFILE_H
void printInfo();
#endif

//myfile.cpp
#include "myfile.h"
#include <iostream>
using std::cout;
using std::endl;
void printInfo()
{
cout<<"hello"<<endl;
}
2)編譯如下:
[quietheart@lv-k bak]$ g++ -c myfile.cpp
[quietheart@lv-k bak]$ g++ -shared -fPCI -o libmy.so myfile.o
[quietheart@lv-k bak]$ ar -r libmy.a myfile.o
ar: creating libmy.a

3)編譯之後,查看生成的文件:
[quietheart@lv-k bak]$ ls -l
總計 44
-rw-r--r-- 1 quietheart quietheart 2154 07-08 16:14 libmy.a
-rwxr-xr-x 1 quietheart quietheart 5707 07-08 16:08 libmy.so
-rwxr-xr-x 1 quietheart quietheart 117 07-08 16:06 myfile.cpp
-rwxr-xr-x 1 quietheart quietheart 63 07-08 16:08 myfile.h
-rw-r--r-- 1 quietheart quietheart 2004 07-08 16:08 myfile.o
libmy.a libmy.so myfile.cpp myfile.h myfile.o
這里,分別生成目標文件myfile.o,共享庫文件libmy.so,和靜態庫文件libmy.a。

㈤ Mac查看so文件的具體信息

了解ELF的文件格式可通過 SO(ELF)文件格式詳解 通過命令greadelf -a xxx.so和gobjmp -x xxx.so以及readelf這三個命令得到so的信息 我個人常用readelf命令,具體指令的使用可參考 readelf命令使用說明 運行下述命令: brew update brew install binutils ELF Header: Section Headers:
閱讀全文

與readelf命令相關的資料

熱點內容
量價王道指標附圖源碼 瀏覽:488
基於51單片機的指紋識別 瀏覽:803
oppoa系列怎麼解壓 瀏覽:603
程序員辭職養豬還值得學編程嗎 瀏覽:866
socket網路編程pdf 瀏覽:104
php函數隨機數字 瀏覽:415
申請杭州戶籍用什麼app 瀏覽:965
eda編譯實驗報告 瀏覽:347
app在哪裡可以下 瀏覽:784
linux防火牆埠號 瀏覽:546
思科模擬器雲與伺服器相連 瀏覽:254
ispf命令 瀏覽:403
考試app怎麼預約 瀏覽:902
數據前處理python 瀏覽:666
pr編譯影片錯誤是為什麼 瀏覽:815
python編譯嵌套的目錄 瀏覽:833
伺服器火災用什麼滅火器 瀏覽:940
tc的編譯設置 瀏覽:519
賣燈具上什麼app 瀏覽:29
如何讓主題好看安卓oppo 瀏覽:918