反匯編Linux
linux gcc編譯c文件頭文件
linux gcc編譯c文件頭文件,使用GCC編譯器編譯C語言
凶豬下山
轉載
關注
0點贊·1047人閱讀
GCC編譯C源代碼有四個步驟:預處理—->編譯—->匯編—->鏈接。
可以利用GCC的參數來控制執行的過程,這樣就可以更深入的了解編譯C程序的褲晌過程。
下面將通過對一個程序的編譯來演示整個過程。
#include
int main()
{
printf("happy new year!\n");
return 0;
}
1:預處理:編譯前純李器將C程序的頭文件編譯進來,還有宏的替換,可以用gcc的參數-E來參看。
預處理 命令:gcc -E hello.c -o hello.i
作用:將hello.c預處理輸出hello.i
2:編譯:這個階段編譯器主要做詞法分析、語法分析、語義分析等,在檢查無錯誤後後,把代碼翻譯成匯編語言。可用gcc的參數-S來參看。
編譯器(ccl)將文本文件hello.i 翻譯成文本文件hello.s, 它包含一個匯編語言程序。匯編語言程序中的每條語句都以一種標準的文本格式描述了一條低級機器語言指令。
編譯命令:gcc -S hello.i -o hello.s
作用:將預處理輸出文件hello.i匯編成hello.s文件
3:匯編:把編譯階段生成的.s 文件轉換為二進制目標代碼。可用gcc的參數-c來參看。匯編器(as)將hello.s翻譯成機器語言指令,把這些指令打包成可重定位目標程序的格式, 並將結果保存在目標文件hello.o中。hello.o文件是一個二進制文件,它的位元組編碼是機器語言。
匯編 命令:gcc -c hello.s -o hello.o
作用:作用:將匯編輸出文件hello.s編譯輸出hello.o文件
4:鏈接:把obj文件鏈接為可執行的文件:鏈接器(ld)負責.o文件的並入。結果就是hello文件,它是一個課執行的目標文件,可以載入到存儲器後由系統調用。
鏈接命令:gcc hello.o -o hello
一步操作的話是: (-o必須在hello之前 )
$gcc hello.c -o hello
$./hello或者:(會默認生成a.out文件)
$gcc hello.c
$./慧遲a.out
⑵ Linux下有沒有類似於OD的反匯編工具
可以試ldasm,不過一般在linux系統,命令行下用gdb
圖形界面的可以試試ddd,其實也是封裝的gdb
⑶ linux反匯編寄存器參數
Linux反匯編寄存器判慶參數包括:
1. EAX:通用寄存器,用於存儲操作數和返回值。
2. EBX:跡侍通用姿沖吵寄存器,用於存儲數據。
3. ECX:通用寄存器,用於計數或循環操作。
4. EDX:通用寄存器,用於處理I/O埠。
5. ESI:源指針寄存器,用於復制數據。
6. EDI:目的指針寄存器,用於復制數據。
7. EBP:幀指針寄存器,用於保留函數調用棧的地址。
8. ESP:棧指針寄存器,由CPU自動維護其內容以衡量棧的大小。
⑷ linux 64位 程序錯誤 如何反匯編找到general protection ip:7fcc6eece1a9
7f是windows api函數,請檢查參數傳入是否有誤,bx等非易失寄存器是否保護
⑸ linux下的ELF可執行文件反匯編去掉驗證代碼
linux下可執行文件不是以後綴命名的,後綴只是讓操作人員自己知道這是什麼類型的文件,對本件本身沒有任何意義。
舉栗:
test.sh #是以shell寫的腳本
test.py #是以python寫的腳本
文件可執行是許可權問題:x許可權表示可執行
⑹ linux反匯編mbr用什麼工具
linux上很容易反匯編的啊。用nasm就可以的。
1、首先讀取穗猜mbr
sudo dd if=/dev/sda of=mbr.bin count=1
dd是linux的命令,需要root許可權的,if是輸入方法 ,在linux上所有的設備都是文件 ,猜指型mbr在第一塊硬碟上,所以if=dev/sda。of=mbr.bin
2、下載nasm
sudo apt-get install nasm
下載安裝nasm
3、反匯編mbr
ndisasm mbr.bin | less
或者
ndisasm mbr.bin >mbr.asm
逗鬧vim mbr.asm
⑺ LINUX下有一般用什麼反匯編工具
答:linux上很容易反匯編的埃用nasm就可以的。 1、首先讀取mbr sudo dd if=/dev/sda of=mbr.bin count=1 dd是linux的命令,需要root許可權的,if是輸入方法 ,在linux上所有的設備都是文件 ,mbr在第一塊硬碟上,所以if=dev/sda。of=mbr.bin
⑻ linux查看c++程序某個函數的反匯編會顯示函數名嗎
這個問題很復雜。這得看你的二進製程序是否包含這些信息。這得看 編譯選項 有沒有包含 -s 。-s選項會剔除不需要的符號名。
正式二進制發布的軟體是可以沒有這些信息的。對於靜態鏈接後 函數名在c/c++ 語言執行的過程中是不需要的,它是通過內存地址 去訪問 內存,數據和代碼。函數名用於 編譯過程 和鏈接過程。對於動太鏈接在程序執行過程由ld.so 通過變數名去 動態的鏈接到某些庫的指定函數。動態鏈接的符號名不可剔除。
說到底就是二進製程序如果包含變數名,就會顯示。
實例
main.c:
intaaa=10;
intmyfunc(){
return5;
}
intmain(){
intbbb=20;
aaa=20;
bbb=myfunc();
return0;
}
gcc-nostdlibmain.c-omain_with_symbols
gcc-nostdlibmain.c-omain_without_symbols
分別產生包含符號名 和不包含符號名的 可執行文件。
!122~/src/c_cpp%objmp-dmain_with_symbols|grepmyfunc
000000000040017c<myfunc>:
4001a5:e8d2ffffffcallq40017c<myfunc>
!123~/src/c_cpp%objmp-dmain_without_symbols|grepmyfunc
!124~/src/c_cpp1%
很明顯使用 -s 選項後 很多符號信息丟失,反匯編中也不包含相關符號名。
⑼ linux中 gcc 下ld 鏈接成什麼格式的目標文件,有生成的哪些文件可以反匯編,反匯編的工具有哪些
elf可執行文件
生成的目標文件(也即.o文件)和elf文件都可以反匯編
反匯編工具就是objmp命令,加個-S的選項就可以了。例如:
objmp -S hello > hello.mp
⑽ 如何在linux下把.so文件反匯編
和反匯編其他程序一樣,用 objmp 或其他你喜歡的反匯編工具都可以的