成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

幾個命令了解ELF文件的”秘密“

系統 Linux
在Linux中,可執行文件的格式是ELF格式,而有一些命令可以幫助我們了解它們更多的“秘密”,以此來幫助我們解決問題。

前言

在Linux中,可執行文件的格式是ELF格式,而有一些命令可以幫助我們了解它們更多的“秘密”,以此來幫助我們解決問題。

[[279073]]

示例程序

我們的示例程序如下:

  1. #include<stdio.h> 
  2. int main(int argc,char *argv[]) 
  3.     printf("hello shouwangxiansheng\n"); 
  4.     return 0 ; 

編譯:

  1. $ gcc -o hello hello.c 

得到hello可執行文件。

查看文件類型

file命令可以用來查看文件類型:

  1. $ file hello 
  2. hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 2.6.32, BuildID[sha1]=8f1de0f59bdfe9aaff85ade6898173aa436b296a, not stripped 

從結果中,我們可以知道,它是ELF可執行文件,且是64位程序,有動態鏈接,最后的not stripped也表明了它保留了符號表信息或者調試信息。

如果不是可執行文件,它的信息是怎樣的呢?舉個例子:

  1. $ file hello.c 
  2. hello.c: C source, UTF-8 Unicode text 

看到了吧。

查看ELF頭

readelf用于查看ELF文件,而:

  1. $ readelf -h hello 
  2. ELF Header: 
  3.   Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00  
  4.   Class:                             ELF64 
  5.   Data:                              2's complement, little endian 
  6.   Version:                           1 (current) 
  7.   OS/ABI:                            UNIX - System V 
  8.   ABI Version:                       0 
  9.   Type:                              EXEC (Executable file) 
  10.   Machine:                           Advanced Micro Devices X86-64 
  11. (略) 

可以看到它是EXEC,即可執行文件,且小端程序,運行于X86-64。在交叉編譯的時候,這個文件頭的信息也非常有用。例如你在x86的機器上交叉編譯出powerpc的可執行文件,在powerpc上卻不被識別,不能運行,不如用readelf看看它的Machine字段,是不是沒有編譯好。

查找ELF文件中的字符串

例如,你在文件中寫入了版本號或者特殊字符串,可以通過strings命令搜索到:

  1. $ strings hello|grep shouwang 
  2. hello shouwangxiansheng 

查看ELF文件各段大小

  1. $ size hello 
  2.    text       data     bss     dec     hex filename 
  3.    1210        552       8    1770     6ea hello 

這里可以看到代碼段,數據段各自占多少,必要時候還可以根據需要優化代碼,減少磁盤空間占用。

查看鏈接的動態庫

運行時出現找不到動態庫?不如看看它鏈接了哪些庫吧:

  1. $ ldd hello 
  2.     linux-vdso.so.1 =>  (0x00007ffd16386000) 
  3.     libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f507e083000) 
  4.     /lib64/ld-linux-x86-64.so.2 (0x00007f507e44d000) 

可以看到它鏈接的動態庫是/lib/x86_64-linux-gnu/libc.so.6,而如果該文件不存在,則運行時將會出錯。這里也可以參考《動態庫的制作和使用》。

查看符號表

新加的函數或者全局變量不知道有沒有編譯進去?如何看看符號表里有沒有吧(前提是符號表沒有被去掉):

  1. $ nm hello |grep main  #符號表中查找main函數 
  2.                  U __libc_start_main@@GLIBC_2.2.5 
  3. 0000000000400526 T main 

如果沒有找到或者前面是U,沒有地址,表明在這個elf文件中沒有定義這個函數。

鏈接出問題的時候很有用。

為ELF文件瘦身

前面通過file查看文件時,看到有not stripped的字樣,由于它里面包含了一些符號表信息,因為文件會稍大,如果去掉,二進制文件將會變小,但是里面的符號表信息也就沒有了,將會影響問題定位。

  1. $ ls -lh hello  #瘦身前 
  2. -rwxrwxr-x 1 root root 8.4K 
  3. $ strip hello 
  4. $ ls -lh hello #瘦身后 
  5. -rwxrwxr-x 1 root root 6.2K 

可以看到,瘦身后二進制文件變得更小。當可執行文件越大時,瘦身效果就會更明顯了。當然放心,這不會影響程序的正常運行,只是對調試和問題定位有影響。

這個時候再看符號表:

  1. $ nm hello 
  2. nm: hello: no symbols 

打印文件校驗和

二進制文件傳輸過程中有沒有被損壞或者是否是同一個版本,看看校驗和以及程序塊計數吧:

  1. $ sum hello 
  2. 33513     7 

當然你也可以使用:

  1. $ md5sum hello 
  2. 521efed706c3b485dd3b5e96e48b138a  hello 

來比對md5值。

總結

ELF文件中隱藏了豐富的信息,只要使用得當,將會幫助我們更好地進行開發或者問題的定位。

 

責任編輯:趙寧寧 來源: 編程珠璣
相關推薦

2023-07-31 07:25:27

2019-07-10 16:07:19

Redis數據庫網絡安全

2019-07-11 08:54:24

Redis安全策略

2010-07-14 15:52:28

Telnet命令

2024-08-26 12:18:07

Python代碼存根

2020-12-24 14:41:03

人工智能人工智能技術

2023-08-17 14:10:11

Java開發前端

2009-09-10 15:26:42

background屬

2010-03-18 15:19:27

Linux命令

2010-03-18 16:06:19

Linux命令

2010-03-18 16:13:58

Linux命令

2021-06-11 13:59:22

CSS原子類

2010-02-03 11:01:26

Linux mount

2014-02-27 09:30:20

2010-03-29 10:38:36

Nginx配置

2023-03-23 21:08:59

head命令

2023-03-24 10:07:46

tail命令

2023-02-02 14:06:00

history命令技巧

2020-05-12 09:02:29

Linux磁盤硬盤

2011-03-04 10:04:31

Linux文件操作命令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美一级精品片在线看 | 久草在线在线精品观看 | 久久精品免费一区二区三 | 午夜精 | 国产精品久久久久久久久免费相片 | 91久久精品国产 | 中文在线一区二区 | 成人av网站在线观看 | 久久精品国产久精国产 | 免费中文字幕 | 久久天天躁狠狠躁夜夜躁2014 | 国产精品久久久免费 | 日韩福利视频 | 中文字幕在线观看一区 | 精品无码久久久久久国产 | 色婷婷综合久久久久中文一区二区 | 国产99视频精品免费播放照片 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 久久精品99 | 2023亚洲天堂| 亚洲国产精品一区二区第一页 | 国产精品99久久久久久www | gav成人免费播放视频 | 精品免费av | 久久免费看 | 狠狠操狠狠色 | 欧美一区二区三区视频在线播放 | 精品欧美| 国产剧情一区二区三区 | 久久se精品一区精品二区 | 国产视频一区二区三区四区五区 | 成人在线视频免费看 | 国产精品欧美一区二区 | 国产精品视频一二三区 | 成人无遮挡毛片免费看 | 午夜激情影院 | 国产成人网 | 日韩最新网址 | 伊人网综合在线观看 | 亚洲免费精品 | 最新国产在线 |