我們知道在 cpu 上執行的是低階別的機器語言,從高階語言到低階別的機器語言是要經過 4 個編譯過程,以 linux 下 gcc 編譯 c 語言程式的過程為例,
如下圖所示:
預處理:編譯器將 c 源**中的包含的標頭檔案如stdio.h編譯進來,替換巨集。
gcc -e hello.c -o hello.i
編譯:gcc 首先要檢查**的規範性、是否有語法錯誤等,以確定**的實際要做的工作,在檢查無誤後,gcc 把**翻譯成組合語言。
gcc –s hello.i –o hello.s
彙編:把編譯階段生成的 」.s」 檔案轉成二進位制目標**。
gcc –c hello.s –o hello.o
gcc hello.o –o hello
目標**(object code):指編譯器和彙編器處理源**後所生成的機器語言目標**
目標檔案(object file):指包含目標**的檔案
可重定位目標檔案(.o 檔案):包含二進位制**和資料,其形式可以和其他目標檔案進行合併,建立乙個可執行目標檔案
可執行目標檔案(如 vi,gdb):包含二進位制**和資料,可直接被載入器載入執行
目標檔案在不同的系統或平台上具有不同的命名格式。如下所示:
elf 檔案即是 linux 等類 unix 上的目標檔案。
elf 檔案提供了兩種不同的視角,在彙編器和鏈結器看來,elf 檔案是由 section header table 描述的一系列 section 的集合,而執行乙個 elf 檔案時,在載入器(loader)看來它是由 program header table 描述的一系列 segment 的集合。
這兩種不同的視角對應兩種檢視,如下所示:
執行檢視(被執行):可執行目標檔案
常見的 elf 檔案大致結構如下:
elf 頭部(elf header):描述整個檔案的組織結構。
程式頭部表(program header table):描述檔案中的各種 segments,用來告訴系統如何建立程序映像的。
節區/段區(section/segments):segments 是從執行的角度來描述 elf 檔案,sections 是從鏈結的角度來描述 elf檔案,也就是說,在鏈結階段,我們可以忽略 program header table 來處理此檔案,在執行階段可以忽略 section header table 來處理此程式。從圖中我們也可以看出,segments 與 sections 是包含的關係,乙個s egment 包含若干個 section。
節區頭部表(section header table):包含了檔案各個 section 的屬性資訊。描述節區的表,每個節區佔乙個項。
4.1.1 格式
readelf elf-file(s)
4.1.2 功能
用於顯示讀取 elf 檔案中資訊。它用來顯示乙個或者多個 elf 格式的目標檔案的資訊,可以通過它的選項來控制顯示哪些資訊。
這裡的 elf-file(s) 就表示那些被檢查的檔案。可以支援 32 位,64 位的 elf 格式檔案,也支援包含 elf 檔案的文件
4.1.3 選項
-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 :--hex-dump=以16進製制方式顯示指定段內內容。number指定段表中段的索引,或字串指定檔案中的段名。
-w[liaprmffsor]或者
-debugdump[=line,=info,=abbrev,=pubnames,=aranges,
=macro,=frames,=frames-interp,=str,=loc,=ranges] 顯示除錯段中指定的內容。
-i :--histogram 顯示符號的時候,顯示bucket list長度的柱狀圖。
-v :--version 顯示readelf的版本資訊。
-h :--help 顯示readelf所支援的命令列選項。
-w :--wide 寬行輸出。
#! /bin/bash
# 功能:檢測當前目錄下的所有 elf 檔案中是否有敏感字, 將符合條件的 elf 檔案路徑存入 result(nm,cat,readelf,objdump)
# 前置條件:
# 當前目錄下的 sensitive.txt : 敏感字字典
# 輸出:
# elf : 當前目錄下所有 elf 檔案的路徑
# result : 含有敏感字的 elf 檔案路徑
# 篩選當前目錄下所有 elf 檔案,並將檔案路徑存入 elf
function findelf
\; | grep "\" | awk -f ':' '' > elf
}# 通過 cat 查詢敏感字,將符合條件的 elf 檔案路徑存入 result
function findsensitiveby_cat
# 通過 nm 查詢敏感字,將符合條件的 elf 檔案路徑存入 result
function findsensitiveby_nm
# 通過 readelf 查詢敏感字,將符合條件的 elf 檔案路徑存入 result
function findsensitiveby_readelf
# 通過 objdump 查詢敏感字,將符合條件的 elf 檔案路徑存入 result
function findsensitiveby_objdump
findelf
findsensitiveby_cat elf
findsensitiveby_nm elf
findsensitiveby_readelf elf
findsensitiveby_objdump elf
java 根據條件從List中篩選出符合條件的集合
1 list 你要在裡面篩選的物件集合 存放格式例如 list.add user1 list.add user2 list.add user3 2 tablecolumnname user 裡面的屬性字段 例如 name 3 agers name欄位的屬性值,也就是你要篩選出 name 的名稱為 張...
尋找符合條件的整數
題目 任意給定乙個正整數n,求乙個最小的正整數m m 1 使得n m的十進位制表示形式裡只含有1和0.解決這個問題首先考慮對於任意的n,是否這樣的m一定存在。可以證明,m是一定存在的,而且不唯一。簡單證明 因為 這是乙個無窮數列,但是數列中的每一項取值範圍都在 0,n 1 之間。所以這個無窮數列中間...
不符合專利的條件的幾種條件
一些屬於不符合專利授予條件的客體 一 科學發現 二 智力活動的規則和方法 三 疾病的診斷和 方法 四 動物和植物品種 五 用原子核變換方法獲得的物質 六 對平面印刷品的圖案 色彩或者二者的結合作出的主要起標識作用的設計 在中國,專利遵循 先申請原則 即兩個以上的申請人分別就同樣的發明創造申請專利的,...